• 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--AOP--面向切面编程
    Spring ---annotation (重点)--Resource, Component 重要!!!
    Spring ---annotation (重点)--AutoWired 不常用
    ts 交集类型
    ts 使用 keyof typeof
    Dart 编写Api弃用警告
    js 反应&行动
    perl 打印简单的help文档
    perl 在windows上获取当前桌面壁纸
    perl 打印目录结构
  • 原文地址:https://www.cnblogs.com/wobuchifanqie/p/12758338.html
Copyright © 2020-2023  润新知