赞
踩
最新的 Java 面试题,技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linux…等等,会持续更新。
如果对老铁有帮助,帮忙免费点个赞,谢谢你的发财手!
造成死锁的4个必要条件:
公平锁和⾮公平锁,它们的底层实现都会使⽤AQS来进⾏排队。
它们的区别在于:
另外,不管是公平锁还是⾮公平锁都是可重⼊的。
AQS分为“排他锁”和“共享锁”两种:
另外AQS也支持同时实现独占和共享两种方式,比如ReentrantReadWriteLock。
底层都是通过AQS实现的。
底层是通过AQS实现的,state 初始化为 0,表示无锁状态;A 线程调用lock(加锁) 时,会将 state加 1 ,直到 A 线程调用 unlock(释放锁) 到 state=0为止,其它线程才有机会获取该锁。当然,释放锁之前,A 线程自己是可以重复获取该锁的,state 会累加,这就是可重入的概念。但要注意,加了多少次就锁要释放多少次,这样才能保证state恢复到0。
理解第4点:Sychronized锁的是对象,锁信息保存在JVM对象头中,ReentrantLock是通过AQS中一个volatile修饰的state 来标识锁的状态。
JDK15默认关闭偏向锁优化,如果要开启可以使用XX:+UseBiasedLocking,但使用偏向锁相关的参数都会触发deprecate警告。
原因:在现在的jdk中,偏向锁加锁时 带来的性能提升 从整体上看并没有过多的收益,但撤销锁的成本过高,需要在一个安全点停止拥有锁的线程,使其变成无锁状态。
CAS工作原理是基于乐观锁且操作是原子性的,与synchronized的悲观锁(底层需要调用操作系统的mutex锁)相比,效率也会相对高一些。
不是,CAS是主要是通过处理器的指令来保证原子性的 。
CAS就是我们所说的比较和交换,是采用的乐观锁技术,来实现线程安全的问题。
CAS有三个属性:旧值(A)、新值(B)、内存对象(V);
CAS原理就是对V进行赋值时,先判断原来的值是否为A,如果为A,就把新值B赋值到V,如果原来的值不是A(代表V的值放生了变化),那么会通过循环再走CAS流程,直到能够把新值B赋值成功(会给CPU带来很大的开销)。
CAS会有ABA的问题,可以通过加版本号,更新的时候时候不仅比较值,还比较版本号。
Synchronized 底层实现由JVM保证:在JVM运行过程中,可能出现偏向锁,轻量级锁,重量级锁。
因此性能比较:偏向锁 > 轻量级锁 > ReentrantLock > Synchronized。
在 java.lang.Thread 中有一个 holdsLock()方法,拥有锁会返回 true 。
高并发情况下,数据库事务未提交,但是锁已经释放。
volatile仅仅保证变量在线程间保持可见性,却依然不能保证非原子性的操作,还是用AtomicInteger类。
使用AtomicInteger.set(0)或.getAndSet(0)。
Git是一款开源的分布式版本控制系统。
都已经看到这里啦,赶紧收藏起来,祝您工作顺心,生活愉快!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。