0

何らかの理由で機能しないシングルトンを使用しています。理由がわかりません

  private static ConnectionUtility instance;

  public static ConnectionUtility getInstance() {
     if(instance == null){
         instance = new ConnectionUtility();
     }
     return instance;
  }

上記のコードでは、このコードの 2 回目の実行では、インスタンスが null ではなく、インスタンスが既に作成されているため、このコードの 2 回目の実行では、インスタンスを返す行に直接移動し、インスタンス = 新しい ConnectionUtility() 行。ただし、2 回目の反復では、ConnectionUtility オブジェクトの別のインスタンスが既に存在する場合に作成を試みます。なぜこれをしているのですか?この問題を解決するには?

以下に投稿された完全なコード: 3 つのクラスの ConnectionUtility および MultiThreader および Start

  public class Start {

   public static void main(String args[]) {

  ConnectionUtility.getInstance();

 } // end main

} // end Start

    public class ConnectionUtility extends javax.swing.JFrame
    implements  MultiThreader.OnSendResultListener {

    private static ConnectionUtility instance;

    public static ConnectionUtility getInstance() {
     if(instance == null){
         instance = new ConnectionUtility();
     }
     return instance;
    }

   private ConnectionUtility() {

     initComponents();
     this.setVisible(true);

     serverRunner();

     File fileOne = new File("C:/DBFiles");
     if(!fileOne.exists()){
         fileOne.mkdir();
     }

     File fileTwo = new File("C:/DBFilesOut");
     if(!fileTwo.exists()){
         fileTwo.mkdir();
     }  

  }
public void serverRunner(){

      runner = true;

       try {
        serversocket = new ServerSocket(6789, 100);

         System.out.println();

    } catch (IOException ex) {
        Logger.getLogger(ConnectionUtility.class.getName()).log(Level.SEVERE, null, ex);
    }

      while(runner){

         try {
             socket = serversocket.accept();

   addAndDisplayTextToString("new connection, inet socket address >>> " + socket.getPort());
   System.out.println(displayString);


         } catch (IOException ex) {
             Logger.getLogger(ConnectionUtility.class.getName()).log(Level.SEVERE, null, ex);
         }

      //     MultiThreader multi = new MultiThreader(socket, this);
         MultiThreader multi = new MultiThreader(socket);
           Thread t = new Thread(multi);
           t.start();

      }  // end while runner loop

  } // end serverRunner method

   public static void addAndDisplayTextToString(String setString){

   StringBuilder stb = new StringBuilder(displayString);

   setString = setString + "\n";

   if(stb.toString() == ""){
   stb.append(setString);
   }else if(stb.toString() != ""){
       stb.insert(0, setString);
   }

    int counter = 0;

  for(int i = 0; i < stb.length(); i++){
      if(stb.substring(i, i + 1).equals("\n")){
           counter++;
      }
  }

  // get the last index of "\n"
  int lastIndex = stb.lastIndexOf("\n");

  int maximum = 4;
  if(counter >= maximum){

      stb.delete(lastIndex, stb.length());
      System.out.println();

  }

  displayString = stb.toString();

 }

@Override
public void onStringResult(String transferString) {
   addAndDisplayTextToString(transferString);
   jTextArea1.setText(displayString);
   System.out.println("RETURNED TRING " + transferString);

}

} // class ConnectionUtility

public class MultiThreader implements Runnable {


  public MultiThreader(Socket s) {
    socket = s;
stpe = new ScheduledThreadPoolExecutor(5);
    listener = ConnectionUtility.getInstance();

}

@Override
public void run() {

    long serialNumber = 0;
    int bufferSize = 0;

     // get input streams
    try {
    bis = new BufferedInputStream(socket.getInputStream());
    dis = new DataInputStream(bis);
    } catch (IOException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }

    sendStatus("New connection strarted");

     // read in streams from server
    try {        
        fileSizeFromClient = dis.readInt();
         sendStatus("File size from client " + fileSizeFromClient);
         serialNumber = dis.readLong();
         sendStatus("Serial mumber from client " + serialNumber);
    } catch (IOException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }

     try {
        bufferSize = socket.getReceiveBufferSize();
         sendStatus("Buffer size " + bufferSize);
    } catch (SocketException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }

    String serialString = String.valueOf(serialNumber);

    File fileDirectory = new File("C:" + File.separator + "DOWNLOAD" + File.separator + serialNumber + File.separator);
    fileDirectory.mkdir();

    File file = new File("C:" + File.separator + "DOWNLOAD" + File.separator + serialNumber + File.separator + "JISSend.pdf");
    try {
        file.createNewFile();
    } catch (IOException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }
    try {
    fos = new FileOutputStream(file);
    bos = new BufferedOutputStream(fos);
    dos = new DataOutputStream(bos);
    } catch (FileNotFoundException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }

    int count = 0;
    byte[] buffer = new byte[fileSizeFromClient];

    try {

      int totalBytesRead = 0;

       while(totalBytesRead < fileSizeFromClient){
       int bytesRemaining = fileSizeFromClient - totalBytesRead;
       int bytesRead = dis.read(buffer, 0, (int)Math.min(buffer.length, bytesRemaining));

        if(bytesRead == -1){
           break;
         }else{

            dos.write(buffer, 0, bytesRead);
            totalBytesRead += bytesRead;

        }
    }

        } catch (IOException ex) {
            Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {

            dos = new DataOutputStream(socket.getOutputStream());

        } catch (IOException ex) {
            Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
        }

        stpe.schedule(new CompareFiles(), 0, TimeUnit.SECONDS);
        stpe.schedule(new CloseResources(), 2, TimeUnit.SECONDS);

  } // end run method

  public class CompareFiles implements Runnable {

    @Override
    public void run() {

  int returnInt = 0;
  FileInputStream fis = null;

    File file = new File("C:/DOWNLOAD/JISSend.pdf");
    try {
        fis = new FileInputStream(file);
    } catch (FileNotFoundException ex) {
        Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }

        int fileLength = (int) file.length();

        sendStatus("Size of database file sent " + fileLength);

         if(fileLength == fileSizeFromClient){

         sendStatus("File sent to server, Successful");   
         returnInt = 1;

         }else if(fileLength != fileSizeFromClient){

         sendStatus("ERROR, file send failed");   
         returnInt = 2;

         }
        try {
            dos.writeInt(returnInt);
        } catch (IOException ex) {
            Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
        }

    } // end run method
   } // end of class comparefiles

   public class CloseResources implements Runnable {

    @Override
    public void run() {

    try {
    fos.flush();
    bis.close();
    bos.close();
    dis.close();
    dos.close();
    socket.close();
    } catch (IOException ex) {
            Logger.getLogger(MultiThreader.class.getName()).log(Level.SEVERE, null, ex);
    }

    } // end run method
  } // end of class closeResources

   public interface OnSendResultListener {
    public void onStringResult(String transferString);
  }

  public void sendStatus(String status){
 listener.onStringResult(status);
  }

  } // end class mulitthreader

編集: これは、connectionUtility で新しいマルチスレッド クラスを作成するために呼び出されたときに、Multithreader クラスのコンストラクタで ConnectionUitlity オブジェクトの 2 番目の呼び出しが行われている場所です。

 public MultiThreader(Socket s) {

    socket = s;
stpe = new ScheduledThreadPoolExecutor(5);
    listener = ConnectionUtility.getInstance();


}
4

1 に答える 1

1

コメントより

マルチスレッド環境では、getInstanceメソッドを同期するか、ダブル チェック ロックを使用する必要があります。また、クラス外での作成を避けるために、コンストラクターはプライベートにする必要があります。http://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-with-examplesを確認する必要があります

于 2013-10-02T06:47:02.480 に答える