线程-AQS-注意的细节点
1.等待通知模式下,一般我们使用notifyAll,因为在通知的时候我们不确定,通知的这个就是我们想要的,所以一般使用notifyAll。
2.独占式获取锁和共享式获取锁,独占式在获取锁的时候,只唤醒后面的一个节点(线程)。共享式获取锁的时候会传播的形式,唤醒后面所有的节点。
Condition,其实也是一个队列。等待队列。
在调用await的时候,把同步器的首节点,放到等待队列的尾部。
在调用signal的时候,会把等待队列中的首节点拿出来,放到同步器的尾部。
注意点,是使用signal还是使用signalAll呢?一般使用signalAll。每个Condition是不同的,是独立的,我只需要唤醒自己的。每次唤醒,只会唤醒只会把第一个拿出来放到同步器的尾部。没有必要通知所有。
可重入锁:
当前线程获取锁之后,自己还能在获取锁。state状态的累加。
公平与非公平锁:
非公平锁直接先执行一次,公平锁会先判断当前有没有队列,有的话放到尾部。
读写锁ReentrantReadWriteLock锁:
读锁,写锁公用一个同步器,sync。
那怎么去更改一个state呢。这个是int类型的,高位是读,低位是写。
那么读又是可重入的,多个线程又是怎么控制的呢?
这里面使用的就是ThreadLocal,每个线程都有一个独立。在它里面去统计各自的重入次数。