zoukankan      html  css  js  c++  java
  • 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");
        }
    }
  • 相关阅读:
    怎样建设一个比较好的地方性商业门户网站
    地方门户网站如何推广
    【转】地方门户网站:地区细分领域的蓝海市场
    【转】测试人员可能会遇到的问题
    【转】工作反思-跳槽篇
    简单验证码识别 tessnet2
    log4net使用详解
    java理论基础学习三
    java理论基础学习二
    java理论基础学习一
  • 原文地址:https://www.cnblogs.com/wobuchifanqie/p/12544609.html
Copyright © 2011-2022 走看看