は、あなたがこのコードを持って言う:Java同期ブロックでは、書き込みはすべてのフィールドで表示されるのか、同期変数だけで表示されますか?
private String cachedToken;
private final Object lockObject = new Object();
....
retrieveToken(){
synchronized(lockObject){
if (cachedToken == null){
cachedToken = goGetNewToken();
}
return cachedToken;
}
}
cachedToken
への書き込みはlockObject
にロックされているすべてのスレッドに対して可視になりますか?
はい、それはポイントです...しかし、書き込みはCPUのl1またはl2キャッシュに起こり、別のスレッドがロックを獲得する前にメインメモリにフラッシュされません。 –
それは当てはまりません。別のスレッドが別のスレッドが書き込みを行った後に別のスレッドが 'lockObject'をロックした場合、スレッドには書き込みが見えます。 –
注: "同期変数"への書き込みは頻繁に*不良*です。コードは変数ではなくオブジェクト上で同期されます。変数が途中で異なるオブジェクトを参照するように変更された場合、その変数が参照するオブジェクトで同期化された複数のブロックが同時に実行される可能性があります。 –