Singletons und Multithreading

Status
Nicht offen für weitere Antworten.

prolahmierer

Mitglied
Hallo!

Ich habe einen Multi-Threaded Server mit n aktiven Verbindungen.

Und eine Klasse die Verbindungsdaten verwaltet, implementiert als Singleton:

Java:
public class PlayerLookup {

    private static PlayerLookup instance = new PlayerLookup();
    
    private HashMap<Socket, LookupAssoc> lookupTable;

    private PlayerLookup() {
	lookupTable = new HashMap<Socket, LookupAssoc>();;
    }

    public static PlayerLookup getInstance() {
	return instance;
    }

    // weitere methoden die auf der HashMap arbeiten folgen hier, z.b.:
    public void removeBySocket(Socket toRemove){
	lookupTable.remove(toRemove);
    }

Wenn neue Verbindungen dazu kommen oder Verbindungen verloren gehen wird das in dieser HashMap geloggt. Nur kriege ich da teilweise die merkwürdigsten Ereignisse.
Weis jemand, in wie weit diese Singleton-Implementierung Thread-Safe ist? Oder muss ich da noch Methoden synchronisieren. Eigentlich dachte ich, die Singleton-Implementierung würde alle Probleme beseitigen. Vielleicht liegt der Fehler auch woanders aber erstmal wollte ich das hier ausschließen.

Danke schon mal,
Prolahmierer
 
M

maki

Gast
[c]removeBySocket[/c] ist nicht Threadsafe, da HashMap eben nicht Threadssafe sind, alle Methoden die die Map ändern sollten synchronisiert werden.
 

Marco13

Top Contributor
Doch, [c]removeBySocket[/c] ist """Thread-safe""", weil das die einzige Methode ist, die irgendwas mit der lookupTable macht :D

Aber davon ausgehend, dass es auch sowas wie "addBySocket" gibt: Dort braucht man synchronisation. Es würde wohl schon reichen, einfach alle Methoden, die auf die lookupTable zugreifen "synchronized" zu machen. Die synchronisation irgendwie bis zur lookupTable selbst reinzuziehen (irgendwie als Collections.synchronizedMap) macht IMHO dort keinen Sinn.
 

prolahmierer

Mitglied
Ok danke, dann liegt da wohl ein Denkfehler vor. Ich dachte durch das Singleton arbeiten alle auf dem selben Objekt und das würde dann "schon in Ordnung gehen". In der Tat gibt es noch weitere Methoden, ich wollte sie jetzt nicht alle hier reinkopieren.

Warum macht eine syncrhonizedMap noch keinen Sinn? Dann wäre doch ruhe und man müsste nicht auf alle Methoden achten.

Grüße :)
 
M

maki

Gast
Ok danke, dann liegt da wohl ein Denkfehler vor. Ich dachte durch das Singleton arbeiten alle auf dem selben Objekt und das würde dann "schon in Ordnung gehen". In der Tat gibt es noch weitere Methoden, ich wollte sie jetzt nicht alle hier reinkopieren.
Eben weil alle Threads auf dem selben Obejkt arbeiten "geht es nicht in Ordnung" ohne zusätzliche Synchronisation.

Warum macht eine syncrhonizedMap noch keinen Sinn?
imho weil Singletons eigentlich immer threadsicher gemacht werden müssen, liegt in der Natur der Sache..
 

prolahmierer

Mitglied
Danke! Das Volatile sieht auch interessant aus, werde ich mal testen.

Noch eine kleine Frage:
Um die eingehenden Daten synchron an eine Klasse zu schicken die die Daten dann bearbeitet, habe ich mir eine BlockingQueue-Klasse gebaut, die die Daten in eine BlockingQueue einreiht. Die Queue läuft als Thread und benachrichtigt bei eingehenden Nachrichten die Bearbeiterklasse:

Kann ich dann davon ausgehen, dass die Daten der Reihe nach vom Bearbeiter abgearbeitet werden und nciht mehr parallel?

Java:
public class GameQueue extends Thread {

    private static GameQueue instance = new GameQueue();
    private BlockingQueue<QueueObject> queue = new LinkedBlockingQueue<QueueObject>();

    private GameQueue() {
	this.setName("Thread-GameQueue");
	start();
    }
    public static GameQueue getInstance() {
	return instance;
    }

    public void run() {
	try {
	    QueueObject inputobj;
	    while ((inputobj = queue.take()) != null) {
		Manager.execute(inputobj) // verkürzt, kommt aber aufs gleiche raus
	    }

	} catch (InterruptedException e) {

	}
    }
 

prolahmierer

Mitglied
Ok vergesst das mit der Queue. Ich hab alle Zugriffe auf die Hashmap synchronisiert, dann geht es (anscheinend ;) ) Die Queue-Zugriffe habe ich auch synchronisiert.

Noch eine Frage:
Warum reicht es nicht nur schreib-zugriffe zu synchronisieren? Wenn ich die Lese-Zugriffe nicht synhchronisiere treten wieder merkwürdige Erscheinungen ans Tageslicht.
Hat das damit zu tun, das er gleichzeitig von Daten liest, die währenddessen verändert werden?
 

Atze

Top Contributor
jop

synchronized read(){}
synchronized write(){}

heißt, das beide methoden eines objekt nur von einem thread durchlaufen werden können, sie sind implizit beide an this sychronisiert.

wenn nur write() sync wäre, kann thread B lesen, was A gerade schreibt. bei sync von beiden darf B erst in read, wenn A aus dem lock ist, also hast du recht
 
S

Spacerat

Gast
Mal abgesehen von der HashMap... was könnte denn bei Multithreading mit Singletons noch so alles schief gehen? Z.B. die Instanzierung des Singletons?
Java:
public final class Singleton
{
  private static final Singleton instance;

  static
  {
    instance = new Singleton();
  }

  private Singleton()
  {
    //...
  }

  public static Singleton getInstance()
  {
    return instance;
  }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
buzzlightyeah multithreading Java Basics - Anfänger-Themen 4
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
I Threads Multithreading, Producer/Consumer, notify() Java Basics - Anfänger-Themen 6
M Mehre Dateien parallel kopieren mit Multithreading Java Basics - Anfänger-Themen 8
kilopack15 Verzweiflung wegen Berechnung mit Multithreading Java Basics - Anfänger-Themen 1
P Multithreading in Java Java Basics - Anfänger-Themen 9
N Threads Read-Modify-Write Problem bei Multithreading (philosopher dining problem) Java Basics - Anfänger-Themen 5
R Threads Multithreading Java Basics - Anfänger-Themen 15
Z Verständnisfrage zum Multithreading Java Basics - Anfänger-Themen 3
T Threads MultiThreading NullPointerException Java Basics - Anfänger-Themen 7
K Frage bzgl. Multithreading Java Basics - Anfänger-Themen 5
B Multithreading und eigene Queue entwickeln Java Basics - Anfänger-Themen 3
C Multithreading, Methoden sichern Java Basics - Anfänger-Themen 5
P Hilfe bei MultiThreading; Einige Fragen. Java Basics - Anfänger-Themen 14
S OOP Multithreading Java Basics - Anfänger-Themen 5
B Multithreading Java Basics - Anfänger-Themen 5
0din Multithreading und stop Java Basics - Anfänger-Themen 5
U Anfängerfrage - Multithreading Java Basics - Anfänger-Themen 8
H Multithreading Java Basics - Anfänger-Themen 7
M Multithreading Java Basics - Anfänger-Themen 18
I Multithreading (Prüfungsvorbereitung) Java Basics - Anfänger-Themen 6
G UI friert bei Multithreading ein Java Basics - Anfänger-Themen 3
J Multithreading mit einer TextArea Java Basics - Anfänger-Themen 29
JFeel-x Multithreading in awt Java Basics - Anfänger-Themen 2
L NullpointerException wegen wahrscheinlichem Multithreading Java Basics - Anfänger-Themen 4
Z Multithreading Java Basics - Anfänger-Themen 2
P Multithreading Java Basics - Anfänger-Themen 22

Ähnliche Java Themen

Neue Themen


Oben