zoukankan      html  css  js  c++  java
  • 5.同步关键字(synchronized)

    同步关键字(synchronized):

    多线程给我们提供方便的时候,也给整个编程增加了难度,尤其是对临界资源的控制,尤为重要。

    一个在操作系统课上,老掉牙的事例,就把这种情况解释的明明白白。

    一对夫妻共用一张银行卡,老公呢准备出去买盒烟,一查卡里还有10000元,

    但在他买烟的同时,他媳妇一下子支出去9999元,现实当中肯定是买不成烟了,

    但多线程中,如果不加以控制,就会造成脏读脏写。

    实例:

    package com.xm.thread.t_19_01_27;
    
    import java.util.concurrent.TimeUnit;
    
    public class SynchronizedDemo  {
    
        public static void main(String[] args) throws InterruptedException {
    
            DemoThread demoThread = new DemoThread();
    
            for(int i=0;i<10000; i++) {
                new Thread(demoThread).start();
            }
    
    
    
            SynchronizedThread synchronizedThread = new SynchronizedThread();
    
            for(int i=0; i<10000; i++) {
                new Thread(synchronizedThread).start();
            }
    
            TimeUnit.SECONDS.sleep(5);
            System.out.println("DemoThread.count=="+demoThread.count);
            System.out.println("SynchronizedThread.count=="+synchronizedThread.count);
        }
    
    }
    
    class DemoThread implements Runnable {
    
        int count = 0;
    
        void add() {
            count ++;
        }
    
        @Override
        public void run() {
            add();
        }
    }
    
    
    class SynchronizedThread implements Runnable{
    
        int count = 0;
    
        synchronized void add() {
            count ++;
        }
    
        @Override
        public void run() {
            add();
        }
    }
    
    

    运行结果:

    第1次:

    DemoThread.count==9999

    SynchronizedThread.count==10000

    第2次:

    DemoThread.count==10000

    SynchronizedThread.count==10000

    结果分析:

    多个线程同时操作count资源,不加以同步关键字的控制,就会出现脏写的情况。

    而Synchronized同步关键字,可以保证操作的原子性。

    同步资源控制的三种方式:

    1.方法上加同步关键字

    2.方法内加同步关键字,控制整个对象资源

    3.方法内加同步关键字,控制单一资源

    实例:

    package com.xm.thread.t_19_01_27;
    
    import java.util.concurrent.TimeUnit;
    
    public class SynchronizedDemo1 implements Runnable {
    
        private Object object = new Object();
    
        /**
         * 1.同步关键字加在方法上
         */
        synchronized void doing(){
    
        }
    
        /**
         * 2.方法内加同步关键字,控制整个对象资源
         */
        void doing1() {
            synchronized (this){
    
            }
        }
    
        /**
         * 3.方法内加同步关键字,控制单一资源
         */
        void doing2() {
            synchronized (object) {
    
            }
        }
    
    
        @Override
        public void run() {
    
        }
    }
    
    
    
    

    分析:

    第一种与第二种,效果相同。

    第三种最为灵活高效,对哪个资源操作,就控制哪个资源。

  • 相关阅读:
    Automated Telephone Exchange
    Babelfish
    又见回文
    487-3279
    Robot Motion
    99. Recover Binary Search Tree
    98. Validate Binary Search Tree
    97. Interleaving String
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
  • 原文地址:https://www.cnblogs.com/TimerHotel/p/thread05.html
Copyright © 2011-2022 走看看