wait():使一個(gè)線(xiàn)程處于等待狀態(tài),并且釋放所持有的對象的lock。
sleep():使一個(gè)正在運知行的線(xiàn)程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法,調用此道方法要捕捉InterruptedException異常。
notify():?jiǎn)拘岩粋€(gè)處于等待狀態(tài)的線(xiàn)程,注意的是在調用此方法的時(shí)候,并不專(zhuān)能確切的喚醒某一個(gè)等待狀態(tài)的線(xiàn)程,而是由JVM確定喚醒哪個(gè)線(xiàn)程,而且不是按優(yōu)先級。
Allnotity():?jiǎn)拘阉刑幦氲却隣顟B(tài)的線(xiàn)程,注意并不是給所有喚醒線(xiàn)程一個(gè)對象的鎖,而是讓屬它們競爭。
1。同步代碼塊:
synchronized(同一個(gè)數據){} 同一個(gè)數據:就是N條線(xiàn)程同時(shí)訪(fǎng)問(wèn)一個(gè)數據。
2。
同步方法:
public synchronized 數據返回類(lèi)型 方法名(){}
就
是使用 synchronized 來(lái)修飾某個(gè)方法,則該方法稱(chēng)為同步方法。對于同步方法而言,無(wú)需顯示指定同步監視器,同步方法的同步監視器是
this
也就是該對象的本身(這里指的對象本身有點(diǎn)含糊,其實(shí)就是調用該同步方法的對象)通過(guò)使用同步方法,可非常方便的將某類(lèi)變成線(xiàn)程安全的類(lèi),具有如下特征:
1,該類(lèi)的對象可以被多個(gè)線(xiàn)程安全的訪(fǎng)問(wèn)。
2,每個(gè)線(xiàn)程調用該對象的任意方法之后,都將得到正確的結果。
3,每個(gè)線(xiàn)程調用該對象的任意方法之后,該對象狀態(tài)依然保持合理狀態(tài)。
注:synchronized關(guān)鍵字可以修飾方法,也可以修飾代碼塊,但不能修飾構造器,屬性等。
實(shí)現同步機制注意以下幾點(diǎn): 安全性高,性能低,在多線(xiàn)程用。性能高,安全性低,在單線(xiàn)程用。
1,不要對線(xiàn)程安全類(lèi)的所有方法都進(jìn)行同步,只對那些會(huì )改變共享資源方法的進(jìn)行同步。
2,如果可變類(lèi)有兩種運行環(huán)境,當線(xiàn)程環(huán)境和多線(xiàn)程環(huán)境則應該為該可變類(lèi)提供兩種版本:線(xiàn)程安全版本和線(xiàn)程不安全版本(沒(méi)有同步方法和同步塊)。在單線(xiàn)程中環(huán)境中,使用線(xiàn)程不安全版本以保證性能,在多線(xiàn)程中使用線(xiàn)程安全版本.
線(xiàn)程通訊:
為什么要使用線(xiàn)程通訊?
當
使用synchronized
來(lái)修飾某個(gè)共享資源時(shí)(分同步代碼塊和同步方法兩種情況),當某個(gè)線(xiàn)程獲得共享資源的鎖后就可以執行相應的代碼段,直到該線(xiàn)程運行完該代碼段后才釋放對該
共享資源的鎖,讓其他線(xiàn)程有機會(huì )執行對該共享資源的修改。當某個(gè)線(xiàn)程占有某個(gè)共享資源的鎖時(shí),如果另外一個(gè)線(xiàn)程也想獲得這把鎖運行就需要使用wait()
和notify()/notifyAll()方法來(lái)進(jìn)行線(xiàn)程通訊了。
Java.lang.object 里的三個(gè)方法wait() notify() notifyAll()
wait方法導致當前線(xiàn)程等待,直到其他線(xiàn)程調用同步監視器的notify方法或notifyAll方法來(lái)喚醒該線(xiàn)程。
wait(mills)方法
都是等待指定時(shí)間后自動(dòng)蘇醒,調用wait方法的當前線(xiàn)程會(huì )釋放該同步監視器的鎖定,可以不用notify或notifyAll方法把它喚醒。
notify()
喚醒在同步監視器上等待的單個(gè)線(xiàn)程,如果所有線(xiàn)程都在同步監視器上等待,則會(huì )選擇喚醒其中一個(gè)線(xiàn)程,選擇是任意性的,只有當前線(xiàn)程放棄對該同步監視器的鎖定后,也就是使用wait方法后,才可以執行被喚醒的線(xiàn)程。
notifyAll()方法
喚醒在同步監視器上等待的所有的線(xiàn)程。只用當前線(xiàn)程放棄對該同步監視器的鎖定后,才可以執行被喚醒的線(xiàn)程
一、java允許多線(xiàn)程并發(fā)控制,當多個(gè)線(xiàn)程同時(shí)操作一個(gè)可共享的資源變量時(shí)(如數據的增刪改查),
將會(huì )導致數據不準確,相互之間產(chǎn)生沖突,因此加入同步鎖以避免在該線(xiàn)程沒(méi)有完成操作之前,被其他線(xiàn)程的調用, 從而保證了該變量的唯一性和準確性。
二、實(shí)現方法:
1、同步方法
即有synchronized關(guān)鍵字修飾的方法。
由于java的每個(gè)對象都有一個(gè)內置鎖,當用此關(guān)鍵字修飾方法時(shí),內置鎖會(huì )保護整個(gè)方法。在調用該方法前,需要獲得內置鎖,否則就處于阻塞狀態(tài)。
代碼如: public synchronized void save(){}123
注: synchronized關(guān)鍵字也可以修飾靜態(tài)方法,此時(shí)如果調用該靜態(tài)方法,將會(huì )鎖住整個(gè)類(lèi)
2、同步代碼塊
即有synchronized關(guān)鍵字修飾的語(yǔ)句塊。被該關(guān)鍵字修飾的語(yǔ)句塊會(huì )自動(dòng)被加上內置鎖,從而實(shí)現同步。
3、使用特殊域變量(volatile)實(shí)現線(xiàn)程同步
1)volatile關(guān)鍵字為域變量的訪(fǎng)問(wèn)提供了一種免鎖機制;
2)使用volatile修飾域相當于告訴虛擬機該域可能會(huì )被其他線(xiàn)程更新,
3)因此每次使用該域就要重新計算,而不是使用寄存器中的值
4)volatile不會(huì )提供任何原子操作,它也不能用來(lái)修飾final類(lèi)型的變量
4、使用重入鎖實(shí)現線(xiàn)程同步
在JavaSE5.0中新增了一個(gè)java.util.concurrent包來(lái)支持同步。
ReentrantLock類(lèi)是可重入、互斥、實(shí)現了Lock接口的鎖,它與使用synchronized方法和快具有相同的基本行為和語(yǔ)義,并且擴展了其能力
5、使用局部變量實(shí)現線(xiàn)程同步
如果使用ThreadLocal管理變量,則每一個(gè)使用該變量的線(xiàn)程都獲得該變量的副本,副本之間相互獨立,這樣每一個(gè)線(xiàn)程都可以隨意修改自己的變量副本,而不會(huì )對其他線(xiàn)程產(chǎn)生影響。
實(shí)現同步機制有兩個(gè)方法:
1、同步代碼塊:
synchronized(同一個(gè)數據){} 同一個(gè)數據:就是N條線(xiàn)程同時(shí)訪(fǎng)問(wèn)一個(gè)數據。
2、同步方法:
public synchronized 數據返回類(lèi)型 方法名(){}
就是使用 synchronized 來(lái)修飾某個(gè)方法,則該方法稱(chēng)為同步方法。對于同步方法而言,無(wú)需顯示指定同步監視器,同步方法的同步監視器是 this 也就是該對象的本身(這里指的對象本身有點(diǎn)含糊,其實(shí)就是調用該同步方法的對象)通過(guò)使用同步方法,可非常方便的將某類(lèi)變成線(xiàn)程安全的類(lèi),具有如下特征:
1,該類(lèi)的對象可以被多個(gè)線(xiàn)程安全的訪(fǎng)問(wèn)。
2,每個(gè)線(xiàn)程調用該對象的任意方法之后,都將得到正確的結果。
3,每個(gè)線(xiàn)程調用該對象的任意方法之后,該對象狀態(tài)依然保持合理狀態(tài)。
注:synchronized關(guān)鍵字可以修飾方法,也可以修飾代碼塊,但不能修飾構造器,屬性等。
實(shí)現同步機制注意以下幾點(diǎn): 安全性高,性能低,在多線(xiàn)程用。性能高,安全性低,在單線(xiàn)程用。
1,不要對線(xiàn)程安全類(lèi)的所有方法都進(jìn)行同步,只對那些會(huì )改變共享資源方法的進(jìn)行同步。
2,如果可變類(lèi)有兩種運行環(huán)境,當線(xiàn)程環(huán)境和多線(xiàn)程環(huán)境則應該為該可變類(lèi)提供兩種版本:線(xiàn)程安全版本和線(xiàn)程不安全版本(沒(méi)有同步方法和同步塊)。在單線(xiàn)程中環(huán)境中,使用線(xiàn)程不安全版本以保證性能,在多線(xiàn)程中使用線(xiàn)程安全版本.
聲明:本網(wǎng)站尊重并保護知識產(chǎn)權,根據《信息網(wǎng)絡(luò )傳播權保護條例》,如果我們轉載的作品侵犯了您的權利,請在一個(gè)月內通知我們,我們會(huì )及時(shí)刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學(xué)習?shū)B(niǎo). 頁(yè)面生成時(shí)間:3.474秒