zoukankan      html  css  js  c++  java
  • synchronized用static修饰和不用static修饰的区别,synchronized同步代码块this和类的Class对象作为锁的区别。

    看下面的例子:

    package com.andy.juc;
    
    public class SynchronizedTest {
        public static void main(String[] args) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    sub();
                }
            }).start();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            SynchronizedTest.add();
        }
    
    
        public static synchronized void add(){
            System.out.println("hello add");
        }
    
        public static synchronized void sub()  {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("hello sub");
        }
    }

    一个是实例方法,一个是静态方法

    package com.andy.juc;
    
    public class SynchronizedTest {
        public static void main(String[] args) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    sub();
                }
            }).start();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            new SynchronizedTest().add();
            
        }
    
    
        public  synchronized void add(){
            System.out.println("hello add");
        }
    
        public static synchronized void sub()  {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("hello sub");
        }
    }

    创建两个对象,分别调用自己的实例方法,不会有并发问题。

    package com.andy.juc;
    
    public class SynchronizedTest {
        public static void main(String[] args) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    new SynchronizedTest().sub();
                }
            }).start();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            new SynchronizedTest().add();
    
        }
    
    
        public  synchronized void add(){
            System.out.println("hello add");
        }
    
        public  synchronized void sub()  {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("hello sub");
        }
    }

    同一个对象,锁资源相互排斥

    package com.andy.juc;
    
    public class SynchronizedTest {
        public static void main(String[] args) {
            SynchronizedTest synchronizedTest = new SynchronizedTest();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    synchronizedTest.sub();
                }
            }).start();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronizedTest.add();
    
        }
    
    
        public  synchronized void add(){
            System.out.println("hello add");
        }
    
        public  synchronized void sub()  {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("hello sub");
        }
    }

    同步代码块,用类的Class对象来加锁,互斥

    package com.andy.juc;
    
    public class SynchronizedTest {
        public static void main(String[] args) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    new SynchronizedTest().sub();
                }
            }).start();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            new SynchronizedTest().add();
    
        }
    
    
        public   void add(){
            synchronized(SynchronizedTest.class){
                System.out.println("hello add");
            }
        }
    
        public  void sub()  {
            synchronized(SynchronizedTest.class){
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("hello sub");
            }
    
        }
    }
  • 相关阅读:
    20172304 结对编程--四则运算实验总结
    寒假作业01
    20162317-20162315结对编程(四则运算)第二周阶段总结
    20162317袁逸灏 第十二周实验报告:实验三
    20162317-20162315结对编程(四则运算)第一周阶段总结
    关于解决MySort
    《程序设计与数据结构》第9周学习总结
    20162317 2016-2017-2 《程序设计与数据结构》第8周学习总结
    20162317袁逸灏 第八周实验报告:实验二 Java面向对象程序设计
    学号 2016-2017-2 《程序设计与数据结构》第7周学习总结
  • 原文地址:https://www.cnblogs.com/mkl34367803/p/14761275.html
Copyright © 2011-2022 走看看