关于AQS

全称是AbstractQueuedSynchronized,是阻塞式和相关的同步器工具的框架

特点

  • 用state属性来表示资源的状态(分独享模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁
    • getState -获取state状态
    • setState -设置state状态
    • compareAndSetState -乐观锁机制设置state状态
    • 独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源
  • 提供了基于FIFO的等待队列,类似于Monitor的EntryList
  • 条件变量来实现等待、唤醒机制、支持多个条件变量,类似于Monitor的WaitSet

子类主要实现这样一些方法(默认抛出UnsupportedOperationException)

  • tryAcquire
  • tryRelease
  • tryAcquireShared
  • tryReleaseShared
  • isHeldExclusively

自定义锁

// 不可重入锁
public class MyLock implements Lock {class MySync extends AbstractQueuedSynchronizer {@Overrideprotected boolean tryAcquire(int arg) {// 加上了锁,并设置owner为当前线程if (compareAndSetState(0, 1)) {setExclusiveOwnerThread(Thread.currentThread());}return false;}@Overrideprotected boolean tryRelease(int arg) {setExclusiveOwnerThread(null);setState(0);// state 是被volatile修饰的变量,在此语句后加入写屏障,保证其上部的代码的可见性return true;}@Overrideprotected boolean isHeldExclusively() {return getState() == 1;}public Condition newCondition(){return new ConditionObject();}}private MySync sync = new MySync();@Override // 加锁(不成功进入等待队列)public void lock() {sync.acquire(1);}@Override // 加锁,可打断public void lockInterruptibly() throws InterruptedException {sync.acquireInterruptibly(1);}@Override // 尝试加锁(只会尝试一次)public boolean tryLock() {return sync.tryAcquire(1);}@Override // 尝试加锁,同时带超时时间public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {return sync.tryAcquireSharedNanos(1,unit.toNanos(time));}@Override // 解锁public void unlock() {// state置位0,owner置位null,唤醒阻塞线程sync.release(1);}@Override // 创建条件变量public Condition newCondition() {return sync.newCondition();}
}

关于AQS

全称是AbstractQueuedSynchronized,是阻塞式和相关的同步器工具的框架

特点

  • 用state属性来表示资源的状态(分独享模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁
    • getState -获取state状态
    • setState -设置state状态
    • compareAndSetState -乐观锁机制设置state状态
    • 独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源
  • 提供了基于FIFO的等待队列,类似于Monitor的EntryList
  • 条件变量来实现等待、唤醒机制、支持多个条件变量,类似于Monitor的WaitSet

子类主要实现这样一些方法(默认抛出UnsupportedOperationException)

  • tryAcquire
  • tryRelease
  • tryAcquireShared
  • tryReleaseShared
  • isHeldExclusively

自定义锁

// 不可重入锁
public class MyLock implements Lock {class MySync extends AbstractQueuedSynchronizer {@Overrideprotected boolean tryAcquire(int arg) {// 加上了锁,并设置owner为当前线程if (compareAndSetState(0, 1)) {setExclusiveOwnerThread(Thread.currentThread());}return false;}@Overrideprotected boolean tryRelease(int arg) {setExclusiveOwnerThread(null);setState(0);// state 是被volatile修饰的变量,在此语句后加入写屏障,保证其上部的代码的可见性return true;}@Overrideprotected boolean isHeldExclusively() {return getState() == 1;}public Condition newCondition(){return new ConditionObject();}}private MySync sync = new MySync();@Override // 加锁(不成功进入等待队列)public void lock() {sync.acquire(1);}@Override // 加锁,可打断public void lockInterruptibly() throws InterruptedException {sync.acquireInterruptibly(1);}@Override // 尝试加锁(只会尝试一次)public boolean tryLock() {return sync.tryAcquire(1);}@Override // 尝试加锁,同时带超时时间public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {return sync.tryAcquireSharedNanos(1,unit.toNanos(time));}@Override // 解锁public void unlock() {// state置位0,owner置位null,唤醒阻塞线程sync.release(1);}@Override // 创建条件变量public Condition newCondition() {return sync.newCondition();}
}