1) 2021-11-15 学习记录,以面试回答口吻记录,拒绝八股 1.锁的隔离级别 2.CAS(个人总结用)

2021-11-15 学习记录(有错提出,期望每天进步一点)

1.锁的隔离级别

无锁 -> 偏向锁 -> 轻量级锁 ->重量级锁
偏向锁一般用不上,默认是延迟4秒开启的,通过下面这个JVM参数可以讲延迟设置为0.
-XX:BiasedLockingStartupDelay=0,同一个线程调用,如果有线程竞争就会锁升级,轻量级锁可以认为就说自旋锁,自旋锁一般为10次,是指暂时得不到对象的锁,然后自己自旋循环等待获得锁,如果循环十次锁就会升级成重量级锁,自旋锁是线程安全和性能的综合考虑。重量级锁是代表有线程竞争时,例如synchronized修饰,就是一种重量级锁。体现为markword对象头,可添加jdk-jol依赖,ClassLayout打印对象头。重量级锁 010 轻量级锁 000 偏向锁 101 无锁 001 GC 111。。Synchronized在单个线程使用锁,输出的其实是轻量级锁的Mark word头,在涉及线程竞争的时候变成010重量级锁。

2.CAS

比较并交换,乐观锁,CAS(要操作的内存变量,期待值,要修改的值)返回布尔类型。
会遇到ABA问题,这个时候可以使用Atomic原子类的 AtomicMarkableReference(通过布尔类型返回是否被修改过) 和 AtomicStampedReference (通过int值的计数反映是否被修改过)

 Atomi类 主要通过volatile和CAS (compare and swap) 和native方法来实现,避免synchronized的开销,CAS的底层则是,Unsafe的objectOffeset()的本地方法,这个方法返回原来地址的内存值,拿这个值和预期的值比较,valueOffset,value是一个volatile变量,因此可以保证任何时候JVM拿到的都是value的最新值。

猜你喜欢

转载自blog.csdn.net/qq_45095838/article/details/121357573