zoukankan      html  css  js  c++  java
  • Android-Java-解决(多线程存钱案例)的安全隐患-synchronized

    多线程存钱案例:

    package android.java.thread10;
    
    /**
     * 两个储户,到同一个银行存钱,每个人存了3次,一次1000000.00元
     * 1.描述银行
     * 2.描述储户任务
     * 3.分析这个多线程是否存在安全隐患
     */
    
    /**
     * 1.描述银行
     */
    class Bank {
    
        private double moneyAsset;
    
        public void addMoney(double moneyAsset) {
            this.moneyAsset += moneyAsset;
            System.out.println(Thread.currentThread().getName() + "存入" + this.moneyAsset + "元");
        }
    
    }
    
    /**
     * 2.描述储户任务
     */
    class Customer implements Runnable {
    
        private Bank bank = new Bank();
    
        @Override
        public void run() {
            for (int i = 0; i < 3; i++) {
                bank.addMoney(1000000.00);
            }
        }
    }
    
    public class BankTest {
    
        public static void main(String[] args) {
            // 定义执行的任务
            Runnable customer = new Customer();
    
            // 线程执行>>>定义执行的任务
            new Thread(customer).start();
            new Thread(customer).start();
        }
    
    }

    执行结果,每次结果不同是由于CPU随机执行某个线程造成的

    但是出现这种情况,就是出现了安全问题,Thread-1存入2000000.0元,Thread-0存入2000000.0元:

    Thread-1存入2000000.0元
    Thread-0存入2000000.0元
    Thread-1存入3000000.0元
    Thread-0存入4000000.0元
    Thread-1存入5000000.0元
    Thread-0存入6000000.0元

    对于为什么会出现安全问题,可以看Android-多线程安全问题-synchronized博客


    解决安全问题,找到此程序 多线程执行共享数据/变化共享数据的代码,然后用synchronized{} 

    package android.java.thread10;
    
    /**
     * 两个储户,到同一个银行存钱,每个人存了3次,一次1000000.00元
     * 1.描述银行
     * 2.描述储户任务
     * 3.分析这个多线程是否存在安全隐患
     */
    
    /**
     * 1.描述银行
     */
    class Bank {
    
        /**
         * 3.分析这个多线程是否存在安全隐患 这里就是多线程执行的共享对象的共享数据
         */
        private double moneyAsset;
    
        public void addMoney(double moneyAsset) {
    
            /**
             * 多线程执行共享数据/变化共享数据的代码,然后用synchronized{}
             */
            synchronized (Bank.class) { // 只持有一把锁Bank.class
                this.moneyAsset += moneyAsset;
                System.out.println(Thread.currentThread().getName() + "存入" + this.moneyAsset + "元");
            }
        }
    
    }
    
    /**
     * 2.描述储户任务
     */
    class Customer implements Runnable {
    
        /**
         * 3.分析这个多线程是否存在安全隐患 这里就是多线程执行的共享对象
         */
        private Bank bank = new Bank();
    
        @Override
        public void run() {
            for (int i = 0; i < 3; i++) {
                bank.addMoney(1000000.00);
            }
        }
    }
    
    public class BankTest {
    
        public static void main(String[] args) {
            // 定义执行的任务
            Runnable customer = new Customer();
    
            // 线程执行>>>定义执行的任务
            new Thread(customer).start();
            new Thread(customer).start();
        }
    
    }

    执行结果:

     

  • 相关阅读:
    The provided URI scheme 'http' is invalid; expected 'https'. Parameter name: via
    WCF传递Stream时,同时传递其它参数的问题
    DotNet NB 学习公众号
    军师旅团营连排班各有多少人
    OAuth 2.0学习
    人生三境界
    Mac OS安装Windows各版本时注意事项(2014年后的Mac机相信会有这些问题)
    C#中winform使用相对路径读取文件的方法
    Sql Server Report Service 的部署问题(Reporting Service 2014為什麼不需要IIS就可以運行)
    Reporting Services报表常用的URL参数
  • 原文地址:https://www.cnblogs.com/android-deli/p/10230449.html
Copyright © 2011-2022 走看看