synchronized与ReentrantLock的区别
2021-05-02 本文已影响0人
挖打发
1 底层实现
synchronize是jvm层的锁,是java的关键字,通过monitor实现(monitorenter和monitorexit),reentrantLock是jdk1.5以来提供的API层面的锁,synchronize是通过锁的升级(偏向锁 -> 轻量级锁 -> 重量级锁)完成的,偏向锁:偏向第一个获取到锁的线程,如果第二次到同步代码块,线程判断持有锁的线程是自己就继续往下执行,由于之前没有释放,就不需要重新加锁,轻量级锁:第二个线程加入竞争,就会转为轻量级锁(自旋锁),第二个线程通过不断循环判断是否可以获得锁,获得锁的操作就是CAS,重量级锁:当自旋操作达到一定的次数(jvm默认为10次)就会将轻量级锁转换为重量级锁,当新的线程到达时判断当前线程为重量级锁,新的线程就会挂起,等待当前线程执行完任务后唤醒新的线程,reentrantLock是通过CAS自旋保证原子性和volatile保证可见性实现锁的功能
2 手动性
synchronize是自动的,不需要用户去手动释放锁,reentrantLock是手动的,需要手动释放锁,一般在finally块中释放锁
3 中断性
synchronize不可中断,reentrantLock可以中断线程去等待锁
4 公平性
synchronize是不公平的,不会按等待锁的线程到达顺序去分配锁,reentrantLock可以设为公平,也可以设为不公平
5 条件性
synchronize不可绑定condition,只能通过object的wait/notify/notifyAll唤醒随机线程或者唤醒全部线程,而reentrantLock绑定condition,通过await/singal实现线程的精确唤醒