今天被人问到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++