zoukankan      html  css  js  c++  java
  • Java深入学习20:synchronized

    Java深入学习20:synchronized

    先看一个没有synchronizd修饰的普通方法

    public class SynTest implements  Runnable {
        private static int count ;
        public SynTest() {
            this.count = 0;
        }
        @Override
        public void run() {
            for(int i=0; i<5; i++){
                System.out.println(Thread.currentThread().getName() + ": " +(++count));
            }
        }
        public static void main(String[] args) {
            SynTest synTest = new SynTest();
            Thread thread1 = new Thread(synTest, "thread1");
            Thread thread2 = new Thread(synTest, "thread2");
            thread1.start();
            thread2.start();
        }
    }
    ---------------------日志--------------------------
    thread1: 1
    thread2: 1
    thread1: 2
    thread2: 3
    thread2: 5
    thread2: 6
    thread1: 4
    thread2: 7
    thread1: 8
    thread1: 9

    问题:两个线程并发,竞争资源,导致(1)获取相同的值(thread1: 1和thread2: 1); (2)输出结果顺序不可控

    1- 修饰一个代码块

    public class SynTest2 implements  Runnable {
        private static int count ;
        public SynTest2() {
            this.count = 0;
        }
        @Override
        public void run() {
            synchronized (this){
                for(int i=0; i<5; i++){
                    System.out.println(Thread.currentThread().getName() + ": " +(++count));
                }
            }
        }
        public static void main(String[] args) {
            //方式1
            SynTest2 synTest = new SynTest2();
            Thread thread1 = new Thread(synTest, "thread1");
            Thread thread2 = new Thread(synTest, "thread2");
            thread1.start();
            thread2.start();
    
            //方式2
            SynTest2 synTest1 = new SynTest2();
            SynTest2 synTest2 = new SynTest2();
            Thread thread3 = new Thread(synTest1, "thread3");
            Thread thread4 = new Thread(synTest2, "thread4");
            thread3.start();
            thread4.start();
        }
    }
    ----------------------单独执行方式1日志----------------------
    thread1: 1
    thread1: 2
    thread1: 3
    thread1: 4
    thread1: 5
    thread2: 6
    thread2: 7
    thread2: 8
    thread2: 9
    thread2: 10
    ----------------------单独执行方式2日志----------------------
    thread3: 1
    thread4: 2
    thread3: 3
    thread4: 4
    thread3: 5
    thread3: 7
    thread3: 8
    thread4: 6
    thread4: 9
    thread4: 10

    END

  • 相关阅读:
    spring websocket 记录
    mysql-enum
    再问jvm内存管理
    video相关参数、操作和事件
    监听页面关闭和刷新的总结
    VUE路由新页面打开的方法总结
    VUE的一个数据绑定与页面刷新相关的bug
    element-ui笔记
    Vue笔记(props和 mounted)
    Python总结(二)
  • 原文地址:https://www.cnblogs.com/wobuchifanqie/p/12758338.html
Copyright © 2011-2022 走看看