Einfach ausgedrückt bedeutet "thread-safe", dass eine Methode oder Klasseninstanz von mehreren Threads gleichzeitig verwendet werden kann, ohne dass Probleme auftreten.
Betrachten Sie die folgende Methode:
private int myInt = 0;
public int AddOne()
{
int tmp = myInt;
tmp = tmp + 1;
myInt = tmp;
return tmp;
}
Nun möchten sowohl Thread A als auch Thread B Folgendes ausführen AddOne()
. aber A beginnt zuerst und liest den Wert von myInt (0)
in tmp
. Aus irgendeinem Grund beschließt der Scheduler nun, Thread A anzuhalten und die Ausführung auf Thread B zu verschieben. myInt
(immer noch 0) in seine eigene Variable tmp. Thread B beendet die gesamte Methode, so dass am Ende myInt = 1
. Und 1 wird zurückgegeben. Jetzt ist wieder Thread A an der Reihe. Thread A macht weiter. Und addiert 1 zu tmp (tmp war 0 für Thread A). Und speichert dann diesen Wert in myInt
. myInt
ist wieder 1.
In diesem Fall wird also die Methode AddOne()
wurde zwei Mal aufgerufen, aber da die Methode nicht thread-sicher implementiert wurde, wurde der Wert von myInt
ist nicht 2, wie erwartet, sondern 1, weil der zweite Thread die Variable myInt
bevor der erste Thread seine Aktualisierung beendet hat.
Die Erstellung von thread-sicheren Methoden ist in nicht-trivialen Fällen sehr schwierig. Und es gibt eine ganze Reihe von Techniken. In Java können Sie eine Methode markieren als synchronized
bedeutet dies, dass nur ein Thread diese Methode zu einem bestimmten Zeitpunkt ausführen kann. Die anderen Threads warten in der Reihe. Dadurch wird eine Methode zwar thread-sicher, aber wenn in einer Methode viel Arbeit zu erledigen ist, wird dadurch viel Platz verschwendet. Eine andere Technik ist 'nur einen kleinen Teil einer Methode als synchronisiert markieren'. indem eine Sperre oder ein Semaphor angelegt und dieser kleine Teil (gewöhnlich der kritische Abschnitt genannt) gesperrt wird. Es gibt sogar einige Methoden, die als sperrfreie, thread-sichere Methoden implementiert sind, was bedeutet, dass sie so aufgebaut sind, dass mehrere Threads sie gleichzeitig durchlaufen können, ohne jemals Probleme zu verursachen; dies kann der Fall sein, wenn eine Methode nur einen atomaren Aufruf ausführt. Atomare Aufrufe sind Aufrufe, die nicht unterbrochen werden können und jeweils nur von einem Thread ausgeführt werden können.
5 Stimmen
Normalerweise bedeutet "thread safe", was immer die Person, die den Begriff verwendet, denkt, dass es bedeutet, zumindest für diese Person. Als solches ist es kein sehr nützliches Sprachkonstrukt - man muss viel, viel spezifischer sein, wenn man über das Verhalten von threaded Code spricht.
8 Stimmen
Duplizieren?: stackoverflow.com/questions/261683/
0 Stimmen
@dave Sorry, ich habe versucht zu suchen, aber aufgegeben...trotzdem danke...
1 Stimmen
Ein Code, der nicht auftaucht
Race-Condition