線程互斥的幾種方式 多線程的同步和互斥有什么區(qū)別?
多線程的同步和互斥有什么區(qū)別? 舉例說(shuō)明: 假如把整條道路看成是一個(gè)【進(jìn)程】的話,那么馬路中間白色虛線分隔開(kāi)來(lái)的各個(gè)車道就是進(jìn)程中的各個(gè)【線程】了?! 、龠@些線程(車道)共享了進(jìn)程(道路)的公共資
多線程的同步和互斥有什么區(qū)別?
舉例說(shuō)明: 假如把整條道路看成是一個(gè)【進(jìn)程】的話,那么馬路中間白色虛線分隔開(kāi)來(lái)的各個(gè)車道就是進(jìn)程中的各個(gè)【線程】了?! ?/p>
①這些線程(車道)共享了進(jìn)程(道路)的公共資源(土地資源)?! ?/p>
②這些線程(車道)必須依賴于進(jìn)程(道路),也就是說(shuō),線程不能脫離于進(jìn)程而存在(就像離開(kāi)了道路,車道也就沒(méi)有意義了)。
③這些線程(車道)之間可以并發(fā)執(zhí)行(各個(gè)車道你走你的,我走我的),也可以互相同步(某些車道在交通燈亮?xí)r禁止繼續(xù)前行或轉(zhuǎn)彎,必須等待其它車道的車輛通行完畢)。
④這些線程(車道)之間依靠代碼邏輯(交通燈)來(lái)控制運(yùn)行,一旦代碼邏輯控制有誤(死鎖,多個(gè)線程同時(shí)競(jìng)爭(zhēng)唯一資源),那么線程將陷入混亂,無(wú)序之中?! ?/p>
⑤這些線程(車道)之間誰(shuí)先運(yùn)行是未知的,只有在線程剛好被分配到CPU時(shí)間片(交通燈變化)的那一刻才能知道?! ∽ⅲ骸 ∮捎谟糜诨コ獾男盘?hào)量sem與所有的并發(fā)進(jìn)程有關(guān),所以稱之為公有信號(hào)量。公有信號(hào)量的值反映了公有資源的數(shù)量。只要把臨界區(qū)置于P(sem)和V(sem)之間,即可實(shí)現(xiàn)進(jìn)程間的互斥。就象火車中的每節(jié)車廂只有一個(gè)衛(wèi)生間,該車廂的所有旅客共享這個(gè)公有資源:衛(wèi)生間,所以旅客間必須互斥進(jìn)入衛(wèi)生間,只要把衛(wèi)生間放在P(sem)和V(sem)之間,就可以到達(dá)互斥的效果。
多線程的實(shí)現(xiàn)方法,同步有幾種方法?
一、java允許多線程并發(fā)控制,當(dāng)多個(gè)線程同時(shí)操作一個(gè)可共享的資源變量時(shí)(如數(shù)據(jù)的增刪改查),將會(huì)導(dǎo)致數(shù)據(jù)不準(zhǔn)確,相互之間產(chǎn)生沖突,因此加入同步鎖以避免在該線程沒(méi)有完成操作之前,被其他線程的調(diào)用, 從而保證了該變量的唯一性和準(zhǔn)確性。
二、實(shí)現(xiàn)方法:
1、同步方法即有synchronized關(guān)鍵字修飾的方法。由于java的每個(gè)對(duì)象都有一個(gè)內(nèi)置鎖,當(dāng)用此關(guān)鍵字修飾方法時(shí),內(nèi)置鎖會(huì)保護(hù)整個(gè)方法。在調(diào)用該方法前,需要獲得內(nèi)置鎖,否則就處于阻塞狀態(tài)。代碼如: public synchronized void save(){}123注:synchronized關(guān)鍵字也可以修飾靜態(tài)方法,此時(shí)如果調(diào)用該靜態(tài)方法,將會(huì)鎖住整個(gè)類
2、同步代碼塊即有synchronized關(guān)鍵字修飾的語(yǔ)句塊。被該關(guān)鍵字修飾的語(yǔ)句塊會(huì)自動(dòng)被加上內(nèi)置鎖,從而實(shí)現(xiàn)同步。
3、使用特殊域變量(volatile)實(shí)現(xiàn)線程同步
1)volatile關(guān)鍵字為域變量的訪問(wèn)提供了一種免鎖機(jī)制
2)使用volatile修飾域相當(dāng)于告訴虛擬機(jī)該域可能會(huì)被其他線程更新;
3)因此每次使用該域就要重新計(jì)算,而不是使用寄存器中的值;
4)volatile不會(huì)提供任何原子操作,它也不能用來(lái)修飾final類型的變量;
4、使用重入鎖實(shí)現(xiàn)線程同步在JavaSE5.0中新增了一個(gè)java.util.concurrent包來(lái)支持同步。ReentrantLock類是可重入、互斥、實(shí)現(xiàn)了Lock接口的鎖,它與使用synchronized方法和快具有相同的基本行為和語(yǔ)義,并且擴(kuò)展了其能力
5、使用局部變量實(shí)現(xiàn)線程同步如果使用ThreadLocal管理變量,則每一個(gè)使用該變量的線程都獲得該變量的副本,副本之間相互獨(dú)立,這樣每一個(gè)線程都可以隨意修改自己的變量副本,而不會(huì)對(duì)其他線程產(chǎn)生影響。