zoukankan      html  css  js  c++  java
  • 线程安全问题例子

    面试题总是会问写一个线程安全问题的例子,最简单的就是多线程操作同一个成员变量,而且方法没有加锁;如下:

    • 解决方法可以是写一个safeMethod方法,然后直接使用synchronized 关键字,
    • 也可以使用AtomicInteger ,直接使用incrementAndGet方法.基于cas操作的进行增加也是线程安全的
    
    import java.util.concurrent.CompletableFuture;
    import java.util.concurrent.CountDownLatch;
    
    /**
     * @author <a href="mailto:15268179013@139.com">yida</a>
     * @Version 2020-04-22 14:30
     * @Version 1.0
     * @Description ThreadUnSafeDemo
     */
    public class ThreadUnSafeDemo {
    
      //    private AtomicInteger value = new AtomicInteger(1);
      private static int value = 1;
    
      public static void main(String[] args) throws InterruptedException {
    
        CountDownLatch latch = new CountDownLatch(1);
    
        for (int i = 0; i < 5; i++) {
          CompletableFuture.runAsync(() -> {
            while (true) {
              System.out.println("正在出票" + (value++) + "");
    //            safeMethod();
              if (value > 80) {
                latch.countDown();
              }
              try {
                Thread.sleep(1000);
              } catch (InterruptedException e) {
                e.printStackTrace();
              }
            }
          });
        }
        latch.await();
        System.out.println("执行完毕...");
      }
    
      public synchronized static void safeMethod() {
        System.out.println("正在出票" + (value++) + "");
      }
    
    }
    
    
    世界上所有的不公平都是由于当事人能力不足造成的.
  • 相关阅读:
    jacascript 数组
    jacascript 基础数据类型(一)
    JS checkbox 全选 全不选
    sql 循环处理表数据中当前行和上一行中某值相+/-
    C# 围棋盘的画法
    C 中读取键盘码
    C# string.format、string.connect和+=运算 效率计算
    Sqlserver 中exists 和 in
    urldecode解码方法
    SQL server 临时表
  • 原文地址:https://www.cnblogs.com/javayida/p/13346745.html
Copyright © 2011-2022 走看看