JAVA中線程同步方法一般有以下三種:
專(zhuān)注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)鄠邑免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
1 wait方法:
該方法屬于Object的方法,wait方法的作用是使得當(dāng)前調(diào)用wait方法所在部分(代碼塊)的線程停止執(zhí)行,并釋放當(dāng)前獲得的調(diào)用wait所在的代碼塊的鎖,并在其他線程調(diào)用notify或者notifyAll方法時(shí)恢復(fù)到競(jìng)爭(zhēng)鎖狀態(tài)(一旦獲得鎖就恢復(fù)執(zhí)行)。
調(diào)用wait方法需要注意幾點(diǎn):
第一點(diǎn):wait被調(diào)用的時(shí)候必須在擁有鎖(即synchronized修飾的)的代碼塊中。
第二點(diǎn):恢復(fù)執(zhí)行后,從wait的下一條語(yǔ)句開(kāi)始執(zhí)行,因而wait方法總是應(yīng)當(dāng)在while循環(huán)中調(diào)用,以免出現(xiàn)恢復(fù)執(zhí)行后繼續(xù)執(zhí)行的條件不滿足卻繼續(xù)執(zhí)行的情況。
第三點(diǎn):若wait方法參數(shù)中帶時(shí)間,則除了notify和notifyAll被調(diào)用能激活處于wait狀態(tài)(等待狀態(tài))的線程進(jìn)入鎖競(jìng)爭(zhēng)外,在其他線程中interrupt它或者參數(shù)時(shí)間到了之后,該線程也將被激活到競(jìng)爭(zhēng)狀態(tài)。
第四點(diǎn):wait方法被調(diào)用的線程必須獲得之前執(zhí)行到wait時(shí)釋放掉的鎖重新獲得才能夠恢復(fù)執(zhí)行。
2 notify方法和notifyAll方法:
notify方法通知調(diào)用了wait方法,但是尚未激活的一個(gè)線程進(jìn)入線程調(diào)度隊(duì)列(即進(jìn)入鎖競(jìng)爭(zhēng)),注意不是立即執(zhí)行。并且具體是哪一個(gè)線程不能保證。另外一點(diǎn)就是被喚醒的這個(gè)線程一定是在等待wait所釋放的鎖。
notifyAll方法則喚醒所有調(diào)用了wait方法,尚未激活的進(jìn)程進(jìn)入競(jìng)爭(zhēng)隊(duì)列。
3 synchronized關(guān)鍵字:
第一點(diǎn):synchronized用來(lái)標(biāo)識(shí)一個(gè)普通方法時(shí),表示一個(gè)線程要執(zhí)行該方法,必須取得該方法所在的對(duì)象的鎖。
第二點(diǎn):synchronized用來(lái)標(biāo)識(shí)一個(gè)靜態(tài)方法時(shí),表示一個(gè)線程要執(zhí)行該方法,必須獲得該方法所在的類(lèi)的類(lèi)鎖。
第三點(diǎn):synchronized修飾一個(gè)代碼塊。類(lèi)似這樣:synchronized(obj) { //code.... }。表示一個(gè)線程要執(zhí)行該代碼塊,必須獲得obj的鎖。這樣做的目的是減小鎖的粒度,保證當(dāng)不同塊所需的鎖不沖突時(shí)不用對(duì)整個(gè)對(duì)象加鎖。利用零長(zhǎng)度的byte數(shù)組對(duì)象做obj非常經(jīng)濟(jì)。
使用synchronized關(guān)鍵字同步方法就可以了。
public class Foo2 {
private int x = 100;
public int getX() {
return x;
}
//同步方法
public synchronized int fix(int y) {
x = x - y;
System.out.println("線程"+Thread.currentThread().getName() + "運(yùn)行結(jié)束,減少“" + y + "”,當(dāng)前值為:" + x);
return x;
}
}
Java的同步可以用synchronized關(guān)鍵字來(lái)實(shí)現(xiàn)。\x0d\x0a \x0d\x0asychronized可以同步代碼,需要綁定一個(gè)對(duì)象,如synchronized(obj){}\x0d\x0a也可以同步一個(gè)方法,是對(duì)方法進(jìn)行線程同步。如public void synchronized methodA(){}
以Java語(yǔ)言為例:
用synchronized關(guān)鍵字修飾同步方法。
同步有幾種實(shí)現(xiàn)方法分別是synchronized,wait與notify
wait():使一個(gè)線程處于等待狀態(tài),并且釋放所持有的對(duì)象的lock。
sleep():使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法,調(diào)用此方法要捕捉InterruptedException異常。
notify():喚醒一個(gè)處于等待狀態(tài)的線程,注意的是在調(diào)用此方法的時(shí)候,并不能確切的喚醒某一個(gè)等待狀態(tài)的線程,而是由JVM確定喚醒哪個(gè)線程,而且不是按優(yōu)先級(jí)。
Allnotity():喚醒所有處入等待狀態(tài)的線程,注意并不是給所有喚醒線程一個(gè)對(duì)象的鎖,而是讓它們競(jìng)爭(zhēng)。
同步是多線程中的重要概念。同步的使用可以保證在多線程運(yùn)行的環(huán)境中,程序不會(huì)產(chǎn)生設(shè)計(jì)之外的錯(cuò)誤結(jié)果。同步的實(shí)現(xiàn)方式有兩種,同步方法和同步塊,這兩種方式都要用到synchronized關(guān)鍵字。
給一個(gè)方法增加synchronized修飾符之后就可以使它成為同步方法,這個(gè)方法可以是靜態(tài)方法和非靜態(tài)方法,但是不能是抽象類(lèi)的抽象方法,也不能是接口中的接口方法。下面代碼是一個(gè)同步方法的示例:
public synchronized void aMethod() {
// do something
}
public static synchronized void anotherMethod() {
// do something
}
線程在執(zhí)行同步方法時(shí)是具有排它性的。當(dāng)任意一個(gè)線程進(jìn)入到一個(gè)對(duì)象的任意一個(gè)同步方法時(shí),這個(gè)對(duì)象的所有同步方法都被鎖定了,在此期間,其他任何線程都不能訪問(wèn)這個(gè)對(duì)象的任意一個(gè)同步方法,直到這個(gè)線程執(zhí)行完它所調(diào)用的同步方法并從中退出,從而導(dǎo)致它釋放了該對(duì)象的同步鎖之后。在一個(gè)對(duì)象被某個(gè)線程鎖定之后,其他線程是可以訪問(wèn)這個(gè)對(duì)象的所有非同步方法的。
同步塊是通過(guò)鎖定一個(gè)指定的對(duì)象,來(lái)對(duì)同步塊中包含的代碼進(jìn)行同步;而同步方法是對(duì)這個(gè)方法塊里的代碼進(jìn)行同步,而這種情況下鎖定的對(duì)象就是同步方法所屬的主體對(duì)象自身。如果這個(gè)方法是靜態(tài)同步方法呢?那么線程鎖定的就不是這個(gè)類(lèi)的對(duì)象了,也不是這個(gè)類(lèi)自身,而是這個(gè)類(lèi)對(duì)應(yīng)的java.lang.Class類(lèi)型的對(duì)象。同步方法和同步塊之間的相互制約只限于同一個(gè)對(duì)象之間,所以靜態(tài)同步方法只受它所屬類(lèi)的其它靜態(tài)同步方法的制約,而跟這個(gè)類(lèi)的實(shí)例(對(duì)象)沒(méi)有關(guān)系。
當(dāng)前題目:java靜態(tài)同步代碼教程,Java 同步
當(dāng)前網(wǎng)址:http://chinadenli.net/article0/hediio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站營(yíng)銷(xiāo)、企業(yè)建站、網(wǎng)站策劃、網(wǎng)頁(yè)設(shè)計(jì)公司、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)