• 从数硬币看线程安全


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

  • 相关阅读:
    centos7 安装 tesseract4.1
    08 图的数据结构和算法
    07 树形结构及其算法
    05 数组与链表算法
    06 堆栈与队列算法
    04 查找与哈希算法
    03 排序算法
    javascript 标签轮播
    tomcat URI get 参数中文传到后台 乱码 URIEncoding
    javascript 标签切换
  • 原文地址:https://www.cnblogs.com/interfaceone/p/6641429.html
Copyright © 2020-2023  润新知