• 从数硬币看线程安全


    创建并启动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

  • 相关阅读:
    D3DPT_TRIANGLESTRIP 与 D3DPT_TRIANGLEFAN 的区别
    [转]DrawPrimitive 详解Direct3DDevice8
    sublime useful packages
    spring+freemarker 乱码解决办法
    vim 更改注释颜色
    git rollback
    从源码导入到github
    Laravel 安装
    Install Apache 2.2.15, MySQL 5.5.34 & PHP 5.5.4 on RHEL/CentOS 6.4/5.9 & Fedora 19-12 [转]
    Linux / Unix Command: rz
  • 原文地址:https://www.cnblogs.com/interfaceone/p/6641429.html
Copyright © 2020-2023  润新知