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

  • 相关阅读:
    Python 魔术方法及调用方式
    Python metaclasses
    Python 实例方法,类方法和静态方法
    Python 2.x和3.x不同点
    Python 类总结
    Python 添加模块
    Python-读入json文件并进行解析及json基本操作
    linux环境下的python安装过程
    Linux系统目录结构以及简单说明
    linux下python安装
  • 原文地址:https://www.cnblogs.com/wobuchifanqie/p/12758338.html
Copyright © 2011-2022 走看看