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"); } }