(1)下面是一段非线程安全的数值序列生成器代码:
public class UnsafeSequence{
private int value;
public void getNext(){
return value++;
}
}
如果执行时机不对,那么在两个线程调用getNext时会得到相同的值;因为value++看似是一个单独的操作,单事实上它包含三个独立的操作:读取value,将value+1,并将结果写入value;由于运行时可能有多个线程的操作交替执行,因此这两个线程可能同时执行读操作,从而使他们得到相同的值,并同时+1,结果就是,在不同的线程调用中返回了相同的值;
2.将getNext方法设置为synchronized即可修复线程不安全的错误;