int i++和++i是線程安全的嗎?

話不多說,直接貼測試類:

public class ThreadUnSafeDemo {

  //    private AtomicInteger value = new AtomicInteger(1);
  private static int value = 1;
//  private static volatile 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++) + "");
  }

}

執行結果:
在這裏插入圖片描述
結果:不安全,因爲i++,++i會在內存中新建個int j = i+1,然後將j賦值給i,當線程在新建了j的時候,cpu進行了切換,這時候i還是等於原來的值,就會導致不安全,以出票舉例,賣出了99號票賣出了多張…
解決,方法加synchronized,使用AtomicInteger,也就是使用Atomic包下的類,他的方法是具有原子性的…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章