其他分享
首页 > 其他分享> > 锁升级、锁消除、锁粗化

锁升级、锁消除、锁粗化

作者:互联网

一、锁升级

为什么要有锁升级机制?
Synchronized会涉及到用户态和内核态转换,这对性能有极大的影响。为了提高性能

①无锁----->偏向锁------>轻量锁------->重量锁
0 01 1 01 0 00 0 10

②偏向锁:如果很长时间的情况下只有有一个线程持有这个锁,那么这个线程就会一直持有这个锁

③轻量级锁: 假设线程A持有偏向锁,此时线程A有两种情况:
A1:线程A正在执行锁里面的内容
A2:线程A已经执行完锁里的内容
这是线程B也来竞争锁,若线程A处于A1状态,则升级为轻量级锁
若线程A处于A2状态,线程B获得这个锁,若线程A不再CAS则线程B独占锁 ,为偏向锁

④重量锁:多线程竞争激励,升级为重量锁 。自旋到一定次数,空耗CPU,JVM进行自适应,升级成重量锁。

偏向锁一直持有锁,轻量级锁通过CAS来竞争锁,重量级锁涉及到用户态和内核态状态的转换

偏向锁可以变成无锁状态,但锁只能升级,不能降级。

二、锁消除

锁住了自己没有锁住别人,JIT即时编译器进行了优化,消除锁。

public class Study{
    static Object o = new Object(); //正常的只有一把锁

    public void pp(){
        Object o1 = new Object();  //无用锁  形同虚设

        synchronized (o1){
            System.out.println("锁住了自己!!!没用");
        }
    }
    public static void main(String[] args) {


    }
}

三、锁粗化

假如方法中首尾相接,前后相邻的都是同一个锁对象,则JIT将会synchronized合并成一个大块,避免了次次申请和释放锁,提升了性能

public class Study{
    static Object o = new Object(); 

    public void pp(){
        synchronized (o){
            System.out.println("111");
        }

        synchronized (o){
            System.out.println("2222");
        }

        synchronized (o){
            System.out.println("3333333333");
        }
    }
    public static void main(String[] args) {


    }
}
public class Study{
    static Object o = new Object();

    public void pp(){
        synchronized (o){
            System.out.println("111");
            System.out.println("2222");
            System.out.println("3333333333");
        }
        
    }
    public static void main(String[] args) {


    }
}

标签:Object,System,升级,粗化,线程,println,public,消除,out
来源: https://blog.csdn.net/weixin_47315168/article/details/120115571