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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider ist das nicht eine thread-sichere Implementierung des Singleton-Musters. Ich glaube nicht, dass Sie müssen in diesem Fall entweder ein AtomicReference wird wahrscheinlich gut funktionieren. Versuchen Sie dies:
...
Wenn Sie wirklich wollen, verwenden Sie das Singleton-Muster, hier ist eine Referenz ALSO, wo die Frage hat einen guten thread-sichere Implementierung für die Erstellung des Singleton: Java Singleton-Muster
Werden Sie auch brauchen, um den Zugriff auf die Singleton-state-thread-sicher durch die Verwendung
synchronized
,Lock
oder Atomare Operationen (AtomicInteger
,AtomicReference
, etc..) als notwendig.