Java lock和synchronized

学习笔记
在这里插入图片描述
在调用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版权协议,转载请附上原文出处链接和本声明。