Ich habe eine MyService
Klasse, die doTask()
nur eine public
Methode hat, verwende ich synchronized
Schlüsselwort zu halten, in eine Thread-sichere Weise zugegriffen wird:sollte ich 'synchrnonized' Schlüsselwort auch auf meiner privaten Funktion verwenden?
public class MyService {
String myTaskId;
public MyService {
myTaskId = getTaskId();
}
public synchronized void doTask() {
myTaskId = getTaskId();
...
}
private String getTaskId() {
...
}
}
Es gibt eine private Funktion getTaskId()
die sowohl in aufgerufen wird, Konstruktor und in doTask()
Funktion. Ich frage mich, ist es wert, Keyword auch auf getTaskId()
Funktion synchronisiert zu haben?
Ja; nur für den Fall, dass Sie eine weitere nicht synchronisierte Methode hinzufügen, die in Zukunft auch 'getTaskId()' aufruft. Beachten Sie, dass Sie auch die Zuweisung im Konstruktor synchronisieren sollten, um die Sichtbarkeit des zugewiesenen Werts zu gewährleisten. –
@AndyTurner, aber ist es notwendig, im Konstruktor einen synchronisierten Block zu haben? Ich meine nur, nachdem MyService vollständig aufgebaut ist, kann die 'doTask()' als richtig bezeichnet werden? Könnten Sie bitte erläutern, in welchem Szenario das Hinzufügen eines synchronisierten Blocks im Konstruktor erforderlich ist? Oder denken Sie, dass 'MyService' in einem Thread erstellt wird, während auf die gleiche Instanz im anderen Thread zugegriffen wird? Ich bin jetzt verwirrt in diesem Thema. –
Da 'myTaskId' nicht endgültig ist, kann die JVM die Rückgabe des Konstruktors und die Zuweisung von' myTaskId' neu anordnen, was bedeutet, dass einige Threads den Wert vor der Zuweisung lesen können. Sie benötigen den 'synchronisierten' Block, um zu erzwingen, dass die Zuweisung vor der Rückgabe des Konstruktors erfolgt. –