zoukankan      html  css  js  c++  java
  • 从数硬币看线程安全

    创建并启动100个线程,往balance中添加1个硬币,最后balance会为多少呢?

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;

    public class AccountWithoutSync {
        private static Account account =  new Account();

        public static void main(String[] args){
            ExecutorService executor = Executors.newCachedThreadPool();//线程池
            for(int i=0;i<100;i++){//执行100个线程
                executor.execute(new AddPennyTask());
            }
            executor.shutdown();
            while(!executor.isTerminated()){//确认100个线程关闭
            }
            System.out.println("what is the balance?"+account.getBalance());
        }
        
        public static class AddPennyTask implements Runnable{//內部類
            public void run(){
                account.deposit(1);
            }
        }
        
        public static class Account{//內部類
            private int balance = 0;
            public int getBalance() {
                return balance;
            }
            public void deposit(int amount){
                int newBalance = balance + amount;
                try{
                    Thread.sleep(1);//1ms
                }catch(InterruptedException ex){
                    
                }
                balance = newBalance;
            }
        }    
    }

    因为多个线程访问的是同一个balance,所以balance结果不确定。
    what is the balance?7

    what is the balance?8


    共享资源被多个线程同时访问,数据可能遭到破坏。

    lock与synchronize

  • 相关阅读:
    【20171030早】sqli-libs Less7-15 练习
    【20171029中】sqli-libs 注入的过程 less1-4
    【20171028早】ubuntu 16.04 LTS 安装php遇到的问题
    【20171027早】alert(1) to win 第9,10,11,12题
    【20171026早】alert(1) to win
    【20171025晚】alert(1) to win 第五题 正则表达式过滤
    【20171025中】alert(1) to win 脚本渲染自建
    【20171025早】alert(1) to win 练习
    mysql 导入 excel 数据
    我的书单
  • 原文地址:https://www.cnblogs.com/interfaceone/p/6641429.html
Copyright © 2011-2022 走看看