zoukankan      html  css  js  c++  java
  • 线程不安全示例

      以下代码演示了 1000 个线程同时对 cnt 执行自增操作,操作结束之后它的值有可能小于 1000。

    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class UnsafeExemple {
        public  class Exemple{
            private int cnt=0;
            public  void add(){
                cnt++;
            }
            public  int res(){
                return cnt;
            }
        }
        public static void main(String[]args)throws InterruptedException{
            int threadSize=1000;
            UnsafeExemple e=new UnsafeExemple();
            Exemple exemple=e.new Exemple();
            CountDownLatch countDownLatch=new CountDownLatch(threadSize);
            ExecutorService executorService= Executors.newCachedThreadPool();
            for(int i=0;i<threadSize;i++){
                executorService.execute(()->{
                    exemple.add();
    //                System.out.println(exemple.res());
                }
                );
                countDownLatch.countDown();
            }
            countDownLatch.await();
            executorService.shutdown();
            System.out.println(exemple.res());
        }
    }
    
    

      解决线程不安全的方法为对add()方法上锁

    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class UnsafeExemple {
        public  class Exemple{
            private int cnt=0;
            public synchronized void add(){
                cnt++;
            }
            public  int res(){
                return cnt;
            }
        }
        public static void main(String[]args)throws InterruptedException{
            int threadSize=1000;
            UnsafeExemple e=new UnsafeExemple();
            Exemple exemple=e.new Exemple();
            CountDownLatch countDownLatch=new CountDownLatch(threadSize);
            ExecutorService executorService= Executors.newCachedThreadPool();
            for(int i=0;i<threadSize;i++){
                executorService.execute(()->{
                    exemple.add();
    //                System.out.println(exemple.res());
                }
                );
                countDownLatch.countDown();
            }
            countDownLatch.await();
            executorService.shutdown();
            System.out.println(exemple.res());
        }
    }
    
    
  • 相关阅读:
    [九度][何海涛] 顺时针打印矩阵
    [何海涛] 求二元查找树的镜像
    [九度][何海涛] 二叉树中和为某一值的路径
    [面试] 水杯题实现
    [九度][何海涛] 最小的K个数
    [九度][何海涛] 字符串的排序
    如何扩展Orchard
    IoC容器Autofac(3) 理解Autofac原理,我实现的部分Autofac功能(附源码)
    使用PrivateObject帮助单元测试
    Nuget如何自动下载依赖DLL引用
  • 原文地址:https://www.cnblogs.com/yjxyy/p/11123626.html
Copyright © 2011-2022 走看看