「Java Concurrency in Practice」のセクション 14.6.1 で ReentrantLock の実装の詳細について読んだのですが、注釈の何かが私を混乱させました。
保護された状態操作メソッドには揮発性の読み取りまたは書き込みのメモリ セマンティクスがあり、ReentrantLock はgetStateを呼び出した後にのみ所有者フィールドを読み取り、setState を呼び出す前にのみそれを書き込むように注意するため、ReentrantLock は同期状態のメモリ セマンティクスに便乗できます。セクション16.1.4を参照してください。
それが参照するコード:
protected boolean tryAcquire(int ignored) {
final Thread current = Thread.currentThread();
int c = getState();
if (c ==0) {
if (compareAndSetState(0, 1)) {
owner = current;
return true;
}
} else if (current == owner) {
setState(c+1);
return true;
}
return false;
}
そして、これは の の簡略化されnonfairTryAcquire
たコードだと思いますReentrantLock.Sync
。
final boolean nonfairTryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
if (compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0) // overflow
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
したがって、不可解な部分は、 のowner
単なるインスタンス変数である の設定が、他のスレッドでどのAbstractOwnableSynchronizer
ように見えるようになるかです。else if (current == owner)
実際、 の読み込みはowner
の呼び出しの後でありgetState()
(そしてstate
は のvolatile
修飾変数ですAQS
)、 の設定後はowner
何もありません (同期セマンティクスを課すことができます)。データ競合が発生?
さて、この本の権威と徹底的にテストされたコードに照らして、2 つの可能性が頭に浮かびます。
owner = current
設定が隠された作業を行う前の完全なバリア (mfence または 'lock'ed 命令) 。しかし、私がいくつかの有名な記事から学んだことによると、フル バリアは、その後の読み取りだけでなく、その前の書き込みにも関心があります。そうですね、この可能性が正しいとすれば、「JCIP」のいくつかの文は不適切に述べられている可能性があります。if-else の別のブランチにありますが、「地理的に」はコード スニペットの
setState(c+1)
後に来ることに気付きました。owner = current
コメントが言っていることが真実である場合、挿入されたバリアが別のブランチでsetSate(c+1)
同期セマンティクスを課すことができるということですか?owner = current
私はこの分野の初心者であり、いくつかの優れたブログが JVM の基礎となるものを理解するのに大いに役立ちます (順序なし)。
- http://mechanical-sympathy.blogspot.com/
- http://preshing.com/
- http://bartoszmilewski.com
- http://psy-lob-saw.blogspot.com/
常に素晴らしい: http://g.oswego.edu/dl/jmm/cookbook.html
宿題をしてインターネットを検索した後、満足のいく結論に達しません。
これが長すぎたり不明確だったりする場合はご容赦ください (英語は私の母国語ではありません)。これで私を助けてください、関連するものは何でも感謝しています。