synchronized(this/object/类.class)的区别

synchronized this object Class的区别

首先放上结论:

1.this:相当于只有一把钥匙的多把锁,他可以锁住多个代码块,但是每次开锁只能一个,如果钥匙在其他代码块手上,那么新来的被锁的多个代码块就拿不到钥匙,进不了方自己的代码块

2.object:每一个object相当于一把锁,那么不同的锁会有不同的钥匙,这样如果自己的锁不同,一样的锁没有被其他人占据,自己开始能进入代码块

3.类.clss:这是静态的锁,应为静态就带有this的含义,所以不能用this,而用类.class

下面是代码

Main方法–其中线程使用lambda表达式
public class Mian {
    public static void main(String[] args) {
        Material m = new Material();
        new Thread(()->{
            m.doSome();
        }){

        }.start();


        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                m.deOther();

            }
        });
        t2.start();
    }

}
object
class Material{
    private int data1=1;
    private int data2=2;
    private Object lock1 =new Object();
    private Object lock2 =new Object();
    public void doSome() {
        synchronized (lock1) {
            try {
                System.out.println(++data1);
                Thread.sleep(2000);
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void deOther() {
        synchronized (lock2) {
            System.out.println(data1);
        }

    }
}

/*-----------------
结果:
1
2//中间没有时间间隔
------------------*/
this
class Material{
    private int data1=1;
    private int data2=2;
    private Object lock1 =new Object();
    private Object lock2 =new Object();
    public void doSome() {
        synchronized (this) {
            try {
                System.out.println(++data1);
                Thread.sleep(2000);
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void deOther() {
        synchronized (this) {
            System.out.println(data1);
        }

    }
}


/*-----------------
结果:
1
2//中间时间间隔2秒
------------------*/
class
class Material{
    private static int data1=1;
    private int data2=2;
    private Object lock1 =new Object();
    private Object lock2 =new Object();
    public static void doSome() {
        synchronized (Material.class) {
            try {
                System.out.println(data1);
                Thread.sleep(2000);
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    }

    public void deOther() {
        synchronized (this) {
            System.out.println(data1);
        }

    }
}
/*---------------
输出;
1
2//中间没有时间间隔
---------------*/

猜你喜欢

转载自blog.csdn.net/weixin_39841821/article/details/79902810