synchronized 与wait() 和notify() notifyAll() 方法相结合可以实现等待 通知
ReetrantLock也可以实现同样的功能 需要借助condition对象,一个lock对象里面可以创建多个condition(对象监视器),可以选择性的进行线程通知,
notify() 和notifyall() 方法被通知是由jvm随机选择的,condition的使用需要在lock里面。
reetranreadwritelock 可重入读写锁
多个读之间不互斥,读锁与写锁互斥, 写锁与写锁互斥
为何使用读写锁?
如果有很多线程从一个数据结构或者一个公共变量读取数据,而很少的线程修改数据,那么就用读写锁。
分别得到读锁和写锁:
ReentrantReadWriteLock rrwl=new ReentrantReadWriteLock();
ReadLock readL = rrwl.readLock();
WriteLock writeL = rrwl.writeLock();
synchronized在发生异常时,能够自动释放锁,所以不会发生死锁情况;而Lock必须在finally中主动unlock锁,否则就会出现死锁。
参考:https://blog.csdn.net/u012100371/article/details/75270644