线程安全问题例子
面试题总是会问写一个线程安全问题的例子,最简单的就是多线程操作同一个成员变量,而且方法没有加锁;如下:
- 解决方法可以是写一个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++) + "");
}
}
世界上所有的不公平都是由于当事人能力不足造成的.