synchronized和AQS的区别是:1.ReentrantLock 显示的获得、释放锁, synchronized 隐式获得释放锁;2. ReentrantLock 可响应中断、可轮回, synchronized 是不可以响应中断的,为处理锁的不可用性提供了更高的灵活性等。
一、synchronized和AQS的区别
1.ReentrantLock 显示的获得、释放锁, synchronized 隐式获得释放锁
2.ReentrantLock 可响应中断、可轮回, synchronized 是不可以响应中断的,为处理锁的不可用性提供了更高的灵活性
3.ReentrantLock 是 API 级别的, synchronized 是 JVM 级别的
4.ReentrantLock 可以实现公平锁
5.ReentrantLock 通过 Condition 可以绑定多个条件
6.底层实现不一样, synchronized 是同步阻塞,使用的是悲观并发策略, lock 是同步非阻塞,采用的是乐观并发策略
7.Lock 是一个接口,而 synchronized 是 Java 中的关键字, synchronized 是内置的语言实现。
8.synchronized 在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而 Lock 在发生异常时,如果没有主动通过 unLock()去释放锁,则很可能造成死锁现象,因此使用 Lock 时需要在 finally 块中释放锁。
9.Lock 可以让等待锁的线程响应中断,而 synchronized 却不行,使用 synchronized 时,等待的线程会一直等待下去,不能够响应中断。
通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到。
10.Lock 可以提高多个线程进行读操作的效率,既就是实现读写锁等
延伸阅读:
二、Synchronized的流程
- 0.先获取偏向锁,不行再自旋锁,获取到锁就是轻量级锁,如果自旋获取不到锁就是重量级锁。重量级锁的流程就是如下:
- 1.竞争的线程进入contentionList,并迁移部分的竞选者到EntryList,此举是为了降低竞争(防止所有线程同时醒来去CAS获取锁)
- 2.获取锁的线程会在unlock的时候唤醒entryList中的线程,该线程就是onDeck,注意并不是把锁给onDeck,而是允许他
和其他刚准备来获取锁的线程进行竞争(其他已经进入contentionList的线程不会去),这就是非公平性。 - 3.onDeck获取成功则会变为Owner线程,如果owner线程被wait方法阻塞,则转移到WaitSet队列,该队列
会被notify和notifyAll唤醒并重新加入到entryList - 4.线程再进入ContentionList时候 会先自旋获取锁,获取不到就进入contentionList,这也是一个不公平的地方
- 5.每个对象都有一个monitor对象,加锁就说竞争monitor对象。
- 6.优化后的偏向锁和轻量级锁都是对对象头操作,不需要经过操作系统加锁。
以上就是关于synchronized和AQS的区别的内容希望对大家有帮助。