1.对比
1.1主要相同点:
Lock能完成synchronized所实现的所有功能。
1.2不同:
1)ReentrantLock功能性方面更全面,比如时间锁等候,可中断锁等候,锁投票等,因此更有扩展性。在多个条件变量和高度竞争锁的地方,用ReentrantLock更合适,ReentrantLock还提供了Condition,对线程的等待和唤醒等操作更加灵活,一个ReentrantLock可以有多个Condition实例,所以更有扩展性。
2)ReentrantLock必须在finally中释放锁,否则后果很严重,编码角度来说使用synchronized更加简单,不容易遗漏或者出错。
3)ReentrantLock 的性能比synchronized会好点。
4)ReentrantLock提供了可轮询的锁请求,他可以尝试的去取得锁,如果取得成功则继续处理,取得不成功,可以等下次运行的时候处理,所以不容易产生死锁,而synchronized则一旦进入锁请求要么成功,要么一直阻塞,所以更容易产生死锁。
2.Lock底层原理
lock 的存储结构:一个 int 类型状态值(用于锁的状态变更),一个双向链表(用于存储等待中的线程)
lock 获取锁的过程:本质上是通过 CAS 来获取状态值修改,如果当场没获取到,会将该线程放在线程等待链表中。
lock 释放锁的过程:修改状态值,调整等待链表。
可以看到在整个实现过程中,lock 大量使用 CAS + 自旋。因此根据 CAS 特性,lock 建议使用在低锁冲突的情况下。目前 java1.6 以后,官方对 synchronized 做了大量的锁优化(偏向锁、自旋、轻量级锁)。因此在非必要的情况下,建议使用 synchronized 做同步操作。
3.synchronized作用
修饰方法,代码块,静态方法,类
标签:synchronized,Lock,ReentrantLock,链表,线程,状态值,lock From: https://blog.51cto.com/u_15558311/6510042