Java深入学习13:synchronized在静态方法和非静态方法下的同步

Java深入学习13:synchronized在静态方法和非静态方法下的同步

先说结论:

  1-对于一个线程target内的多个非静态方法使用synchronized同步时,非静态方法锁互斥;且非静态方法的锁默认为this实例;即同一线程target实例内非静态方法锁互斥,不同线程target实例非静态方法锁相互不干扰。

  2-对于一个线程target内的多个静态方法使用synchronized同步时,静态方法锁互斥;且非静态方法的锁默认为对应的Class实例;即同一线程target实例内静态方法互斥,不同线程target实例静态方法也互斥。

  3-由1和2可知,静态方法和非静态方法之间相互不干扰

验证结论:

  1-线程Target类内共四个方法:非静态同步方法A,非静态同步方法B,静态同步方法A,静态同步方法B;其中方法A内会线程沉睡1秒。

  2-按照如下顺序依次测试,结果如下。

   3-测试代码

public class MyLockTest {

    public static void main(String[] args) {

        ThreadTarget tt1 = new ThreadTarget();//target实例1
        ThreadTarget tt2 = new ThreadTarget();//target实例2
        
        //线程1
        new Thread(new Runnable() {
            @Override
            public void run() {
                //tt1.getA();//序号1
                //tt1.getA();//序号2
                //tt1.getStaticA();//序号3
                //tt1.getA();//序号4
                //tt1.getA();//序号5
                tt1.getStaticA();//序号6
            }
        }).start();
        //线程2
        new Thread(new Runnable() {
            @Override
            public void run() {
                //tt1.getB();//序号1
                //tt1.getStaticB();//序号2
                //tt1.getStaticB();//序号3
                //tt2.getB();//序号4
                //tt2.getStaticB();//序号5
                tt2.getStaticB();//序号6
            }
        }).start();
    }
}
class ThreadTarget{

    //方法1:非静态同步A
    public synchronized void getA(){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("A");
    }
    //方法2:非静态同步B
    public synchronized void getB(){
        System.out.println("B");
    }
    //方法3:静态同步A
    public static synchronized void getStaticA(){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("static A");
    }
    //方法4:静态同步B
    public static synchronized void getStaticB(){
        System.out.println("static B");
    }
}

猜你喜欢

转载自www.cnblogs.com/wobuchifanqie/p/12544609.html