Singleton threadsafe

_Andi91

Bekanntes Mitglied
Hi,

steh grad ein bisschen aufn Schlauch...
Wie ich die Initialisierung eines Singletons threadsafe mache ist mir klar. Ich benutze hier entweder ein enum als Singleton oder das Holder Idiom.
Aber um das Singleton und dessen Attribute 100%ig threadsafe zu machen, muss ich die Attribute noch zusätzlich als volatile deklarieren?
Das Singleton Objekt liegt ja dann im statischen Speicherbereich!? Die Frage ist dann im Endeffekt also ob dieser zwischen allen Threads geshared wird, oder ob auch von diesem jeder Thread nur eine Kopie macht?
 
M

maki

Gast
Zeig doch mal den Code...

Holder und Enum sorgen nur dafür, dass das "instance" Attribute Threadsicher ist, volatile hilft nur bei einm einzigen Attribut.
synchronized bzw. explizite Locks sind meist die sicherere Möglichkeit.
 

_Andi91

Bekanntes Mitglied
Also einfachstes Beispiel mit einem enum Singleton:

Java:
public enum TestE
{
  INSTANCE;
  
  private String attribute;

  public String getAttribute()
  {
    return attribute;
  }
  public void setAttribute(String attribute)
  {
    this.attribute = attribute;
  }
}

Wenn ich nun in einer multithread Umgebung bin und attribute wird durch einen Thread gesetzt, bekommen die anderen Threads diese Änderung mit? Oder müsste hierfür attribute noch volatile deklariert werden?
 
M

maki

Gast
Bei einm einzigen Attribut reicht volitale, bei mehreren nicht.

Allerdings nutzt du das Enum Singleton wie eine globale Variable, darüber solltest du dir imho mehr Gedanken machen.
 

_Andi91

Bekanntes Mitglied
Bei einm einzigen Attribut reicht volitale, bei mehreren nicht

Wie ist das jetzt genau gemeint? Versteh grad ned was du dami meinst.

Allerdings nutzt du das Enum Singleton wie eine globale Variable, darüber solltest du dir imho mehr Gedanken machen.

Ja schon klar, dass ma des möglichst vermeiden sollte aber manchmal gehts ned anders bzw. machts anders ned viel Sinn.
 
M

maki

Gast
Das meine ich damit:
Java:
// ACHTUNG: falsch!

public enum TestE
{
  INSTANCE;
  
  private String attribute;

  private String anotherAttribute;
 
  public String getAttribute()
  {
    return attribute;
  }

  public void setAttribute(String attribute)
  {
    this.attribute = attribute;
  }

  public String getAnotherAttribute()
  {
    return anotherAttribute;
  }

  public void setAnotherAttribute(String anotherAttribute)
  {
    this.anotherAttribute = anotherAttribute;
  }

}
Das ist nicht Threadsafe, hier bräuchte man explizite Locks oder synchronized.
 

_Andi91

Bekanntes Mitglied
mh also konkret heist das also dann wirklich, dass eine Änderung eines Attributwertes im Singleton evtl. nicht von anderen Threads bemerkt wird?
Wenn es so ist, könnte man dieses Problem ja beheben in dem man alle Attribute im Singleton als volatile deklariert... (oder die setter synchronized)
 

_Andi91

Bekanntes Mitglied
Den Artikel kenne ich.
Wenn ich das richtig verstehe, dann beschreibt folgender Abschnitt im Arktikel genau das, was ich will.

Mehrfach-Veröffentlichung von Information
Betrachten wir den Fall, dass Informationen nicht nur einmal zur Verfügung gestellt werden soll, sondern immer wieder neue Information anderen Threads gegenüber veröffentlicht werden soll. Kann man dafür volatile gebrauchen? Unter Umständen geht es - und zwar immer dann, wenn sich die veröffentlichte Information selbst nicht verändert, sondern stets durch komplett neue ersetzt wird.
Hier ist ein Beispiel:

class TemperatureSensor {
private volatile double theTemperature;
public void setTemperature(double temperature) {
theTemperature = temperature;
}
public void displayTemperature() {
double currentTemparature = theTemperature;
... display currentTemparature ...
}
}

Hier legt ein Sensor-Thread Temperaturinformation in einer volatile-Variablen ab, die andere Threads lesen und anzeigen.
Hier ist der double-Wert nicht Teil einer Invarianten; es gibt keine weiteren Felder. Der neue Temperaturwert hängt nicht vom alten Wert ab. Der Zugriff auf den double-Wert wäre ohne die volatile-Deklaration nicht atomar, aber wenn die double-Variable als volatile deklariert ist, dann ist der Zugriff atomar; Locks werden für Atomarität jedenfalls nicht gebraucht. Man braucht allerdings die Garantie, dass der Wert, den der Sensor-Thread per Aufruf von setTemperature() gesetzt hat, dem Display-Thread sichtbar wird. Diese Sichtbarkeit garantiert ebenfalls die volatile-Deklaration. Also kann man hier auf Synchronisation verzichten.

Allerdings muss man beachten, dass sich der Inhalt des der double-Variablen jederzeit ändern kann. Es können Änderungen verloren gehen, in dem Sinne, dass der Display-Thread sie nicht anzeigt, weil er sie verpasst hat. Es kann auch passieren, dass sich gar nichts geändert hat und der Display-Thread denselben Wert mehrmals anzeigt. Solange das akteptabel ist, funktioniert das Idiom. Sobald aber Werte nicht verloren gehen dürfen oder Mehrfachverwertungen desselben Werts unerwünscht sind, braucht man andere Synchronisationsmechanismen (wie Locks oder atomare Variablen, vielleicht sogar Conditions).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
J Singleton Allgemeine Java-Themen 5
Z deserialize singleton Allgemeine Java-Themen 9
S Singleton Instanz löschen Allgemeine Java-Themen 5
A Datei als Object einlesen und das Object als Singleton instance setzen. Allgemeine Java-Themen 13
T ActionListener und Singleton Allgemeine Java-Themen 15
S Singleton Entwurfsmuster Allgemeine Java-Themen 20
T So eine Art Singleton-Factory? Allgemeine Java-Themen 3
S Singleton-Klasse und ThreadLocal-Klasse von abstrakter Klasse ableiten? Allgemeine Java-Themen 2
S Singleton hier sinnvol? Allgemeine Java-Themen 20
T Zugriff auf Singleton verkürzen - Namespaces?? Allgemeine Java-Themen 20
B Volatile Frage: Reicht es nur den Singleton als volatile zu deklarieren? Allgemeine Java-Themen 4
Iron Monkey Singleton mit Parameter Allgemeine Java-Themen 14
G Singleton Frage: Allgemeine Java-Themen 17
M Singleton und Vererbung? Allgemeine Java-Themen 45
R Wo initilisiere ich eine Liste in einem Singleton? Allgemeine Java-Themen 2
M Java Garbage Collector Frage (Singleton Pattern) Allgemeine Java-Themen 13
B Generisches Singleton implementieren Allgemeine Java-Themen 12
H Singleton und MultiThreading [erledigt] Allgemeine Java-Themen 3
S Singleton Pattern mit Generics Allgemeine Java-Themen 4
P SingleTon Allgemeine Java-Themen 5
M zwei Threads - ein singleton-Objekt Allgemeine Java-Themen 3
RaoulDuke Agent als Singleton Thread Allgemeine Java-Themen 7
S singleton vs. static Allgemeine Java-Themen 7
P Singleton vs static Allgemeine Java-Themen 19
K Singleton vererben Allgemeine Java-Themen 15
E Singleton vererben Allgemeine Java-Themen 10
E Frage zu Singleton Allgemeine Java-Themen 22
D Design Pattern: Singleton Allgemeine Java-Themen 4
K Sequenzdiagramm für Singleton-Muster Allgemeine Java-Themen 5
P volatile bei threadsafe Klassen nötig? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben