首页 > 其他分享 >各种情况下使用synchronized的差别

各种情况下使用synchronized的差别

时间:2024-01-20 22:02:56浏览次数:37  
标签:各种 synchronized void printA 差别 new data class


这里不做原理分析,列举了7种情况,意在我们使用synchronized时更加有底气
。下面的情况都是围绕这个姑且称为定理的东西来讲的
synchronized作用于方法上,有static的修饰时锁定的是调用这个方法的对象
无static修饰时锁定的是拥有这个方法的类的class

情况1

public class test02 {
    public static void main(String[] args) {
        data data1 = new data();
        data data2 = new data();
        new Thread(()->{
            data1.printA();
        },"A").start();
        new Thread(()->{
            data2.printB();
        },"B").start();

        //data.printA(); 先执行,虽然休眠了2秒,但是锁住了data的class,故还是根据执行上下文顺序执行
        //data.printB(); 后执行
    }

    static class data {
        /**
         * @method synchronized锁的是data.class
         */
        public static synchronized void printA() {
            try {
                TimeUnit.SECONDS.sleep(2);
                System.out.println("A");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        /**
         * @method 生产者
         */
        public static synchronized void printB() {
            System.out.println("B");
        }

    }
}

情况2

public class test03 {
    public static void main(String[] args) {
        data data1 = new data();
        data data2 = new data();
        new Thread(() -> {
            data1.printA();
        }, "A").start();
        new Thread(() -> {
            data2.printB();
        }, "B").start();

        //data.printB(); 先执行,虽然休眠了2秒,data1锁住的是data对象。data2锁定的是data的class,
        // 锁定的范围不一致,因此A有休眠后执行
        //data.printA(); 后执行
    }

    static class data {
        /**
         * @method synchronized锁的是调用这个方法的对象
         */
        public static synchronized void printA() {
            try {
                TimeUnit.SECONDS.sleep(2);
                System.out.println("A");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        /**
         * @method 生产者
         */
        public synchronized void printB() {
            System.out.println("B");
        }

    }
}

情况3

public class test04 {
    public static void main(String[] args) {
        data data = new data();
        new Thread(()->{
            data.printA();
        },"A").start();
        new Thread(()->{
            data.printB();
        },"B").start();

        //data.printA(); 先执行,虽然休眠了2秒,但是锁住了data对象,根据执行上下文顺序执行
        //data.printB(); 后执行
    }

    static class data {
        /**
         * @method synchronized锁的是data.class
         */
        public synchronized void printA() {
            try {
                Thread.sleep(2000);
                System.out.println("A");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        /**
         * @method 生产者
         */
        public synchronized void printB() {
            System.out.println("B");
        }

    }
}

情况4

public class test05 {
    public static void main(String[] args) {
        data data = new data();
        new Thread(() -> {
            data.printA();
        }, "A").start();
        new Thread(() -> {
            data.printB();
        }, "B").start();
        new Thread(() -> {
            data.printC();
        }, "C").start();
        //data.printC(); 先执行,因为data.printC()不受syschronized控制
        //data.printA(); 接着执行,虽然休眠了2秒,但是锁住了data对象,根据执行上下文顺序执行
        //data.printB(); 后执行
    }

    static class data {
        /**
         * @method synchronized锁的是data.class
         */
        public synchronized void printA() {
            try {
                Thread.sleep(2000);
                System.out.println("A");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        /**
         * @method 生产者
         */
        public synchronized void printB() {
            System.out.println("B");

        }

        public void printC() {
            System.out.println("C");
        }
    }
}

情况5

public class test06 {
    public static void main(String[] args) {
        data data1 = new data();
        data data2 = new data();
        new Thread(() -> {
            data1.printA();
        }, "A").start();
        new Thread(() -> {
            data2.printB();
        }, "B").start();
        //data.printB(); 先执行,因为syschronized锁的是class,且data1.printA()休眠了2秒
        //data.printA(); 后执行

    }

    static class data {
        /**
         * @method synchronized锁的是data.class
         */
        public synchronized void printA() {
            try {
                Thread.sleep(2000);
                System.out.println("A");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        /**
         * @method 生产者
         */
        public synchronized void printB() {
            System.out.println("B");

        }
    }
}

情况6

public class test06 {
    public static void main(String[] args) {
        data data1 = new data();
        data data2 = new data();
        new Thread(() -> {
            data1.printA();
        }, "A").start();
        new Thread(() -> {
            data2.printB();
        }, "B").start();
        //data.printB(); 先执行,因为syschronized锁的是class,且data1.printA()休眠了2秒
        //data.printA(); 后执行

    }

    static class data {
        /**
         * @method synchronized锁的是data.class
         */
        public synchronized void printA() {
            try {
                Thread.sleep(2000);
                System.out.println("A");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        /**
         * @method 生产者
         */
        public synchronized void printB() {
            System.out.println("B");

        }
    }
}

情况7

public class test07 {
    public static void main(String[] args) {
        data data1 = new data();
        data data2 = new data();
        new Thread(() -> {
            data1.printA();
        }, "A").start();
        new Thread(() -> {
            data2.printB();
        }, "B").start();

        //data.printB(); 先执行,虽然休眠了2秒,data1锁住的是data对象。data2锁定的是data的class,
        // 锁定的范围不一致,因此A有休眠后执行
        //data.printA(); 后执行
    }

    static class data {
        /**
         * @method synchronized锁的是调用这个方法的对象
         */
        public static synchronized void printA() {
            try {
                TimeUnit.SECONDS.sleep(2);
                System.out.println("A");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        /**
         * @method 生产者
         */
        public static synchronized void printB() {
            System.out.println("B");
        }

    }
}


标签:各种,synchronized,void,printA,差别,new,data,class
From: https://blog.51cto.com/u_16414043/9346322

相关文章

  • 制造业适用的各种管理系统介绍及集成
    管理系统如何帮助工厂的简要介绍:ERP系统:它可以管理公司的财务、供应链、人力资源等方面,可以为制造业提供有力的管理和监督支持,帮助工厂控制成本、提高效率。MES系统:它能够实时监控和控制制造过程中的各个环节,包括生产计划、生产进度、物料管理、质量控制、设备维护等。通过MES系统,......
  • Qt/C++自定义界面大全/20套精美皮肤/26套精美UI界面/一键换肤/自定义颜色/各种导航界
    一、前言这个系列对应自定义控件大全,一个专注于控件的编写,一个专注于UI界面的编写,程序员有两大软肋,一个是忌讳别人说自己的程序很烂很多bug,一个就是不擅长UI,基本上配色就直接rgb,对于第一点,只要放松心态,直面自己的不足,不断改进,才能问鼎武林至尊。至于第二点,因为程序员擅长的是逻辑......
  • python中各种函数的用法及注意事项
    比较函数使用这个函数要先导入operator模块:``importoperator``常用的比较函数(>>=<<===!=)依次在下列出operator.gt(a,b)operator.ge(a,b)operator.lt(a,b)operator.le(a,b)operator.eq(a,b)operator.ne(a,b)直接赋值和使用copy函数的区别#!/......
  • MFC---多线程(各种线程同步的比较总结)
    windows线程同步的方式主要有四种:互斥对象Mutex、事件对象event和关键代码段criticalSection,信号量对于上面介绍的三种线程同步的方式,它们之间的区别如下所述:●互斥对象和事件以及信号量都属于内核对象,利用内核对象进行线程同步时,速度较慢,但利用互斥对象和事件对象这样的内核对......
  • ls 与 du查看到的磁盘空间不一样,差别很大
     ls看到的是文件逻辑上占用的空间,du查看到的是文件物理上上占用的块大小。 ls与du查看到文件大小不一致,这涉及到了一个概念:稀疏文件(sparsefile)稀疏文件可能没有实际分配到用来存储用户数据的磁盘空间。SparseFile就是在文件中留有很多空余空间,留备将来插入数据使用。如......
  • 各种语言版本的“Hello, world”程序汇总
    各种语言版本的“Hello,world”程序汇总 2017-05-1011:10“Hello,world”程序是指在计算机屏幕上输出“Hello,world”这行字符串的计算机程序,“hello,world”的中文意思是“世界,你好”。这个例程在BrianKernighan和DennisM.Ritchie合著的《TheCProgrammeLanguage......
  • 安卓之缓存的应用场景以及各种技术优劣分析
    文章摘要        本文主要探讨了安卓开发中的缓存技术及其应用场景,通过分析几种常见的缓存技术,包括内存缓存、磁盘缓存和网络缓存,阐述了它们的优点和缺点。此外,本文还提供了相应的代码示例,以帮助读者更好地理解这些缓存技术的实现方式。一、引言        在当今的应......
  • 安卓之缓存的应用场景以及各种技术优劣分析
    ​文章摘要        本文主要探讨了安卓开发中的缓存技术及其应用场景,通过分析几种常见的缓存技术,包括内存缓存、磁盘缓存和网络缓存,阐述了它们的优点和缺点。此外,本文还提供了相应的代码示例,以帮助读者更好地理解这些缓存技术的实现方式。一、引言        在当......
  • NX 2306 建模-各种倒圆
    状态一:分段倒圆,只倒边的其中一截,效果类似于下图:Tips:拐角突然停止  or   长度限制,区别如下两图   状态二:渐变倒圆:衔接两个不同的大小的倒圆 例如:我想在如下的红色线区间,形成自然过渡Tips1:变半径(结束处软半径更自己看着勾)   Tips2:通过增加点,可以控制......
  • 提取 PE文件 / 目标程序 的各种信息
    前段时间项目需要实现对WindowsPE文件版本信息的提取,如文件说明、文件版本、产品名称、版权、原始文件名等信息。获取这些信息在Windows下当然有一系列的API函数供调用,简单方便。我们先看一下PE文件结构,PE文件由DOS首部,PE文件头,块表,块和调试信息组成,有关PE文件的数据结构......