Ich möchte eine einfache Gewindesichere Klasse schreiben, die verwendet werden könnte, um einen Integer-Wert zu setzen oder zu erhalten.Wie schreibe ich eine einfache Thread-sichere Klasse mit einer flüchtigen Variablen?
Der einfachste Weg ist es, das synchronisiert Schlüsselwort zu verwenden:
public class MyIntegerHolder {
private Integer value;
synchronized public Integer getValue() {
return value;
}
synchronized public void setValue(Integer value) {
this.value = value;
}
}
ich auch versuchen könnte flüchtigen mit:
public class MyIntegerHolder {
private volatile Integer value;
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
}
Ist die Klasse mit den flüchtigen Stichwort Fäden -safe?
Betrachten Sie die folgende Abfolge von Ereignissen:
- Thread A den Wert 5.
- Thread B setzt setzt den Wert auf 7.
- Gewinde C liest den Wert.
Aus der Java Language Specification folgt, dass
- "1" passiert-vor "3"
- "2" passiert-vor "3"
aber ich sehe nicht, wie es aus der Spezifikation folgen könnte, dass "1" passiert-vor "2" so vermute ich, dass "1" nichtpassieren vor "2".
Ich vermute, dass das Gewinde C 7 oder 5 lesen kann ich glaube, die Klasse mit dem flüchtigen Schlüsselwort ist nicht thread-safe und die folgende Sequenz ist auch möglich:
- Thread A setzt die Wert 5.
- Thread B setzt den Wert auf 7.
- Gewinde C liest 7.
- Faden D 5. liest
- Gewinde C liest 7.
- Faden D liest 5.
- ...
Bin ich richtig, dass MyIntegerHolder mit flüchtigen in der Annahme nicht thread-safe?
Ist es möglich, eine Thread-sichere Integer Halter zu machen, indem Atomicinteger mit:
public class MyIntegerHolder {
private AtomicInteger atomicInteger = new AtomicInteger();
public Integer getValue() {
return atomicInteger.get();
}
public void setValue(Integer value) {
atomicInteger.set(value);
}
}
?
Hier ist ein Fragment des Java Concurrency in der Praxis Buch:
"Liest und schreibt von atomaren Variablen haben die gleichen Speicher Semantik als flüchtige Variablen."
Was ist die beste (vorzugsweise nicht blockierende) Schreibweise Gewindesicher MyIntegerHolder?
Wenn Sie die Antwort wissen, würde ich gerne wissen, warum Sie es für richtig halten. Folgt es aus der Spezifikation? Wenn das so ist, wie?
Ich lerne immer noch, wenn jemand mir etwas klarstellen könnte, wäre es großartig. Wie machen die 'synchronisierten' oder' volatilen' Keywords es _thread sicher_? Da die Integer-Zuweisung und das Lesen von sich aus atomar sind, ändert es irgendetwas? Dieser Ansatz erlaubt keine atomaren Inkremente oder sowieso "get-and-set". Danke – Sebi
@Sebi Thread-Safe ist ein Programm, das in zwei oder mehr Threads ausgeführt wird, ohne dass ein Thread auf einem anderen stört. Sie können dieses Problem lösen, ein Thread, der sich auf andere Weise in andere einmischt. Ein einfaches int x = x + x scheint atomar zu sein, ist aber nicht (mehr dafür flüchtiges und atomares suchen)! Um es "threadsicherer zu machen", ist nur ein Weg, das Problem zu lösen. Das macht MORE nicht thread-sicher, ist nur eine andere Implementierung, um das gleiche Problem zu lösen. –
@ThufirHawat Ich bin mir bewusst, was ein thread-sicheres Programm ist, oder dass die Addition mehrere Lesevorgänge vor dem Schreiben umfasst, aber ich bin mir sicher, dass ich etwas nicht über diese Klasse weiß. Ich kann nicht verstehen, wie eine Klasse, die Getter und Setter für eine ganze Zahl ausstellt, dazu verwendet werden könnte, etwas zu tun, was die Thread-Sicherheit erfordert, ohne extern gesperrt zu sein (wobei "Integer" ausreichen würde). – Sebi