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

  • 解决方法可以是写一个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++) + "");
  }

}