Wenn ich eine nicht synchronisierte Methode von meiner synchronisierten Methode aus aufrufen, ist die nicht synchronisierte Methode threadsicher?

8

Ich mache einen Aufruf an eine nicht synchronisierte Methode innerhalb meiner synchronisierten Methode, ist es threadsicher?

Ich habe 2 Methoden wie folgt:

%Vor%     
akshay 24.09.2011, 08:24
quelle

3 Antworten

12

Wenn doSomething2() nur von doSomething1() aufgerufen wird, wird es nur von einem einzelnen Thread für eine einzelne Instanz von MyClass aufgerufen. Es kann immer noch von verschiedenen Threads gleichzeitig über verschiedene Instanzen aufgerufen werden. Wenn es also auf freigegebene Daten wirkt, die nicht spezifisch für die Instanz von MyClass sind, ist es dennoch nicht garantiert, alle Threading-Probleme zu beheben.

Im Grunde genommen müssen Sie sorgfältig über jeden veränderbaren gemeinsamen Zustand nachdenken, der von mehreren Threads verwendet wird - es gibt keine einfachen Fixes, wenn Sie einen veränderbaren gemeinsamen Status benötigen. In Ihrem speziellen Fall müssten Sie auch sicher machen, dass doSomething2() nur von doSomething1() aufgerufen wurde - was bedeuten würde, dass es privat ist, mit ... zu beginnen.

    
Jon Skeet 24.09.2011 08:43
quelle
3

Beim Aufruf von doSomething1() blockiert der Aufrufende Thread Sperren auf dem Monitor der Instanz von% Code%. Bis die Ausführung dieses Threads MyClass beendet hat, bleibt die Sperre bestehen, was beinhaltet, wenn sie in doSomething1 geht. Dies führt dazu, dass andere Threads beim Sperren blockieren.

Beachten Sie: doSomething2 threadsicher macht es nicht.

Weitere Informationen:

TJR 24.09.2011 09:35
quelle
1

Wenn doSomething2() NUR von doSomething1() aufgerufen wird, dann ja - es ist threadsicher.

    
Michał Šrajer 24.09.2011 08:31
quelle

Tags und Links