案例1:value++导致的不安全序列
public class UnsafeSequence implements Runnable{ protected int countDown = 10; private int value = 0; /** * 这里的value++事实上包含3步操作,读取value,给value+1,写入value。 * 并发操作的时候,可能会同时读取,因此可能会返回相同的值,因此不是线程安全的,方法上加synchronized才行。 */ public int getNext(){ int x = value; Thread.yield();//为了让效果更明显,调用yield方法,主动让出进程 x = x+1; value = x; return value; // return value++;//这段代码效果等同于上面这段代码(但是本地运行不出这种效果),所以是线程不安全的 } @Override public void run() { while(countDown-- >0){ System.out.println(Thread.currentThread().getName()+":"+getNext()); } } public static void main(String[] args) { UnsafeSequence us = new UnsafeSequence(); Thread t1 = new Thread(us,"t1"); Thread t2 = new Thread(us,"t2"); t1.start(); t2.start(); } }