話不多說,直接貼測試類:
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包下的類,他的方法是具有原子性的…