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

  • 相关阅读:
    python2中的SSL:CERTIFICATE_VERIFY_FAILED错误的解决办法
    head first 设计模式第一章笔记
    pycharm设置python脚本模板
    zip的压缩和解压命令
    js数组和集合互转
    查看Oracle的连接数
    转 小辉_Ray DOM性能小记
    学习总结之javaScript document对象详解
    MySQL 表的一些操作
    MySQL 的一些操作
  • 原文地址:https://www.cnblogs.com/interfaceone/p/6641429.html
Copyright © 2011-2022 走看看