通過(guò)售票案例分析萍摊,發(fā)現(xiàn)打印出0、-1冰木、-2等錯(cuò)票笼恰。
多線程的運(yùn)行出現(xiàn)了安全問(wèn)題。
問(wèn)題的原因:
當(dāng)多條語(yǔ)句在操作同一個(gè)線程共享數(shù)據(jù)時(shí)逼龟,一個(gè)線程對(duì)多條語(yǔ)句只執(zhí)行了一部分追葡,還沒(méi)有執(zhí)行完,
另一個(gè)線程參與進(jìn)來(lái)執(zhí)行匀钧,導(dǎo)致共享數(shù)據(jù)的錯(cuò)誤谬返。
解決辦法:
對(duì)多條操作共享數(shù)據(jù)的語(yǔ)句,只能讓一個(gè)線程都執(zhí)行完佑刷,在執(zhí)行過(guò)程中酿炸,其他線程不可以參與執(zhí)行。
java對(duì)于多條線程的安全問(wèn)題提供了專業(yè)的解決辦法檀何。
就是同步代碼塊
synchronize(對(duì)象)
{
需要被同步的代碼
}
對(duì)象如同鎖,持有鎖的線程可以在同步中執(zhí)行栓辜。
沒(méi)有持有鎖的線程即使獲取CPU的執(zhí)行權(quán)也進(jìn)不去垛孔,沒(méi)有獲取鎖。
使用同步的前提:
1狭莱,必須要有兩個(gè)或者兩個(gè)以上的線程概作。
2,必須是多個(gè)線程使用同一個(gè)鎖骤素。
必須保證同步中只能有一個(gè)線程在運(yùn)行济竹。
優(yōu)點(diǎn):解決了多線程的安全問(wèn)題。
弊端:多個(gè)線程都需要判斷鎖送浊,較為消耗資源丘跌。