java singleton thread-safe

Ok, hier ist mein problem.

Brauche ich zum erstellen einer socket-Programm, das in der Lage mehrere Verbindung von meinem client apps (lets call it apps1). Ich Griff das mit thread (also jeder Verbindung wurde geworfen in einen neuen thread)

Das problem ist, ich kann akzeptieren, verlangen von allen geöffneten Verbindung, aber wenn will ich eine Antwort senden , muss ich senden Sie es durch die Letzte Verbindung nur. Also wenn ich 3 verbindungen (con1,con2,con3) ich kann akzeptieren, verlangen von con1, con2 und con3 aber ich muss senden Sie die Antwort durch con3 (vorausgesetzt, con3 ist die Letzte Verbindung)

Dachte ich an die Verwendung eines singleton, mit einem PrintWriter-parameter. So gibt es jedes mal eine neue Verbindung ,rufen Sie die singleton, und aktualisieren Sie die parameter und, wenn ich will, schicken Sie die Antwort, bekomme ich den PrintWriter ersten, bevor Sie senden.

Hier ist mein Singleton-Klasse :

public class Singleton {

private static final Singleton instance = new Singleton();

PrintWriter  out;

public static Singleton getInstance() {
    return instance;
}
public Singleton ()
{
    if (instance != null) {
        throw new IllegalStateException("Already instantiated");
    }
}

public PrintWriter getPrintWriter ()
{
    return this.out;
}
public void updatePrintWriter (PrintWriter  out){
    this.out = out;
}
}

Dies ist mein main Programm :

public class SocketAccept{
private ServerSocket mainSocket;
private Socket clientSocket;

    public SocketAccept (int portNumber) {
        Singleton s = Singleton.getInstance();
        do {
        try {
            mainSocket = new ServerSocket(portNumber);
            clientSocket = mainSocket.accept();
            s.updatePrintWriter(new PrintWriter(clientSocket.getOutputStream(), true));
            ClientThread (clientSocket);
        } catch (IOException ex) {
            Logger.getLogger(TestClass.class.getName()).log(Level.SEVERE, null, ex);
        }
        }while (true);//need to change this into thread pool or connection pool    
    } 
}

und das ist mein thread, handle-Buchse :

public class ClientThread extends Thread {

    private Socket cs;
    Singleton s = Singleton.getInstance();
    PrintWriter out;

    private String read(Socket sc) {
        String request = "";
        //read request here
        return request;
    }

    private String process(String request) {
        String response = "";
        //process request here
        return response;
    }

    public ClientThread(Socket clientSocket) {
        this.cs = clientSocket;
    }

    @Override
    public void run() {
        String requestMsg = "";
        String responseMsg = "";
        do {
            requestMsg = read(cs);//read the message

            if (requestMsg.equalsIgnoreCase("SHUTDOWN")) {
                break;
            }
            responseMsg = process(requestMsg);
            out = s.getPrintWriter();
            out.write(responseMsg);
        } while (true);
    }
}

Tun, ich habe es richtig? Oder ist es unmöglich, es zu tun mit singleton?

Danke für die Hilfe.

  • Können Sie bitte erklären, warum alle offenen verbindungen muss immer Druck auf die neuesten stream?
  • Sie möchten ein poster zu erklären, Ihre Anforderungen? Ist das nicht ein bisschen albern? Es ist nicht so, als ob er fragt eine technisch undurchführbar Frage.
  • Scrum-Meister, wenn ich kann, werde ich normalerweise erklären, warum (denn manchmal gibt es eine andere Lösung, wenn Sie die Ursache kennen), leider ist die client-Fragen, für die es ohne Erklärung
InformationsquelleAutor Willy | 2011-02-11
Schreibe einen Kommentar