同步的范围越小越好。同步块比同步整个方法更提升代码的效率。
为什么 wait/notify/notifyAll 这些方法不在 thread 类里面?
JAVA 提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。
由于 wait, notify 和 notifyAll 都是锁级别的操作,所以把他们定义Object 类中,因为锁属于对象。
为什么 wait 和 notify 方法要在同步块中调用?
Java API 强 制 要 求 这 样 做 , 如果你不这么做 , 代码会抛出IllegalMonitorStateException 异常
避免 wait 和 notify 之间产生竞态条件
ReentrantReadWriteLock
一个线程要想同时持有写锁和读锁,必须先获取写锁再获取读锁;写锁可以“降级”为读锁;读锁不能“升级”为写锁。
高16位为读锁,低16位为写锁
读锁最大数量:2^16-1=65535
写锁最大数量:2^16-1=65535
如果当前只有一个线程的话,还不需要动用ThreadLocal,直接往firstReaderHoldCount这个成员变量里存重入数,当有第二个线程来的时候,就要动用ThreadLocal变量readHolds了,每个线程拥有自己的副本,用来保存自己的重入数。