今天被人問到volatile能不能保證並發安全?
呵,這能難倒我?
上代碼:(代碼太長建議跳到頁末)
//電腦太好,100線程起步~
public class ThreadTest { private static volatile int num = 0; public static void main(String[] args) throws InterruptedException { new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++) { num++; System.out.println(num); } }).start(); new Thread(() -> { for (int i = 0; i < 100; i++