目录
1. 可见性不安全例子
可见性:一个线程对共享变量的修改,另外一个线程不能够立刻看到。
如果多线程对共享数据进行访问而不采取同步操作的话,那么操作的结果是不一致的。
以下代码演示了 1000 个线程同时对 i执行自增操作,操作结束之后它的值有可能小于 1000。
public class ThreadUnsafeExample {
private int i= 0;
public void add() {
i++;
}
public int get() {
return i;
}
}
public static void main(String[] args) throws InterruptedException {
final int threadSize = 1000;
ThreadUnsafeExample example = new ThreadUnsafeExample();
final CountDownLatch countDownLatch = new CountDownLatch(threadSize);
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < threadSize; i++) {
executorService.execute(() -> {
example.add();
countDownLatch.countDown();
});
}
countDownLatch.await();
executorService.shutdown();
System.out.println(example.get());
}
2. 原子性不安全例子
原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
3. 有序性不安全例子
有序性:即程序执行的顺序按照代码的先后顺序执行。