独占锁和共享锁

1. 独占锁

独占锁模式下,每次只能有一个线程能持有锁,ReentrantLock就是以独占方式实现的互斥锁。

2. 共享锁

共享锁模式下,则允许多个线程同时获取锁,并发访问共享资源,如:ReadWriteLockSemaphore是一种共享锁。

AQS的内部类Node定义了两个常量SHAREDEXCLUSIVE,他们分别标识AQS中的CLH双向队列中等待线程的锁获取模式。

  • 独占锁获取锁时,设置节点模式为Node.EXCLUSIVE
    public final void acquire(int arg) {
        if (!tryAcquire(arg) &&
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();
    }
  • 共享锁获取锁,节点模式则为Node.SHARED
     private void doAcquireShared(int arg) {
        final Node node = addWaiter(Node.SHARED);
        boolean failed = true;
        .....
    }

你可能感兴趣的:(独占锁和共享锁)