(1)下面是一段非線程安全的數(shù)值序列生成器代碼:
public class UnsafeSequence{
? ? private int value;
? ? public void getNext(){
? ? ? ? return value++;
? ? }
}
如果執(zhí)行時(shí)機(jī)不對(duì)腹侣,那么在兩個(gè)線程調(diào)用getNext時(shí)會(huì)得到相同的值叔收;因?yàn)関alue++看似是一個(gè)單獨(dú)的操作,單事實(shí)上它包含三個(gè)獨(dú)立的操作:讀取value筐带,將value+1今穿,并將結(jié)果寫入value;由于運(yùn)行時(shí)可能有多個(gè)線程的操作交替執(zhí)行伦籍,因此這兩個(gè)線程可能同時(shí)執(zhí)行讀操作蓝晒,從而使他們得到相同的值腮出,并同時(shí)+1,結(jié)果就是芝薇,在不同的線程調(diào)用中返回了相同的值胚嘲;
2.將getNext方法設(shè)置為synchronized即可修復(fù)線程不安全的錯(cuò)誤;