学习笔记
在调用wait和notify之前,需要先用synchronized获取对象的Monitor
同理使用await和signal之前需要先加锁.
lock和synchronized的区别
1、原始构成
synchronize是Java关键字属于JVM层面
使用monitorenter和monitorexit实现(底层是通过monitor对象来完成,wait、notify也是依赖于monitor对象,因此只有在同步块或者方法中才能调用)
lock是具体类(java.concurrent.locks.lock是api层面的锁。
2、使用方法
synchronize不需要用户自己释放锁,代码块执行完系统自动让线程释放锁。
reentrantlock则需要用户去手动释放,否则可能导致死锁。
3、等待是否 可中断
synchronize不可中断,正常完成或者抛异常才能退出
reentrantlock可中断
1)设置超时方法trylock
2)lockInterruptibly()放代码块中,调用interrupt()方法可中断
4、加锁是否公平
synchronize非公平
reentrantlock默认非公平,但可以设置
5、锁绑定多个条件Condition
synchronize没有
reentrantlock用来实现分组召唤需要唤醒的线程们,可以精确召唤,而不是像synchronize那样随机唤醒一个或者全部唤醒。
版权声明:本文为D1124615130原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。