synchronized和AQS的区别?
一、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唤醒并重新加入到entryList4.线程再进入ContentionList时候 会先自旋获取锁,获取不到就进入contentionList,这也是一个不公平的地方5.每个对象都有一个monitor对象,加锁就说竞争monitor对象。6.优化后的偏向锁和轻量级锁都是对对象头操作,不需要经过操作系统加锁。
以上就是关于synchronized和AQS的区别的内容希望对大家有帮助。
相关推荐HOT
更多>>数据屏蔽有哪些一般规则?
一、数据屏蔽的一般规则数据屏蔽技术需要遵循一些规则,以便转换后的数据仍然有用。1、数据屏蔽必须是不可逆的一旦数据屏蔽技术转换了真实数据...详情>>
2023-10-11 06:00:16基础设施即代码 (IaC) 有哪些优势?
一、基础设施即代码 (IaC)的优势借助自动化流程,IaC 协助企业以多种方式管理其 IT 基础设施需求。以下是部署 IaC 的部分优势:1、提高一致性Ia...详情>>
2023-10-11 03:45:03什么是数据联合?
一、什么是数据联合数据联合是允许多个数据库作为一个数据库运行的软件过程。该虚拟数据库从各种来源获取数据,并将它们全部转换为通用模型。这...详情>>
2023-10-11 00:48:14人才管理领域的主要趋势有哪些?
一、人才管理领域的主要趋势有哪些如今,人们的工作和生活越来越融为一体,企业也在转变其运营模式。各种趋势正在重塑人才管理战略,助力员工取...详情>>
2023-10-10 23:15:27