public final void acquireShared(int arg)调用该方法能够以共享模式获取状态,共享模式和之前的独占模式有所区别。以文件的查看为例,如果一个程序在对其进行读取操作,那么这一时刻,对这个文件的写操作就被阻塞,相反,这一时刻另一个程序对其进行同样的读操作是可以进行的。如果一个程序在对其进行写操作,那么所有的读与写操作在这一时刻就被阻塞,直到这个程序完成写操作。
以读写场景为例,描述共享和独占的访问模式,如下图所示:
上图中,红色代表被阻塞,绿色代表可以通过。
[url=][/url]
01 public final void acquireShared(int arg) {02 if (tryAcquireShared(arg) < 0) doAcquireShared(arg); } private void doAcquireShared(int arg) {
final Node node = addWaiter(Node.SHARED);
boolean failed = true;
try {
boolean interrupted = false;
for (;;) {
final Node p = node.predecessor();
if (p == head) {
int r = tryAcquireShared(arg);
if (r >= 0) {03 setHeadAndPropagate(node, r);04 p.next = null; // help GC05 if (interrupted)06 selfInterrupt();07 failed = false;08 return;09 }10 }11 if (shouldParkAfterFailedAcquire(p, node) &&12 parkAndCheckInterrupt())13 interrupted = true;14 }15 } finally {16 if (failed)17 cancelAcquire(node);18 }19 }[url=][/url]