一共有3類鎖 ,方法鎖、對象鎖、類鎖。(方法鎖也是對象鎖的一種)
一、對象鎖
對象鎖
public class object {
private Lock lock = new ReentrantLock();//JavaSE1.5.新增了一個java.util.concurrent包來支持同步
public void method(){
synchronized(this){
System.out.println("我是對象鎖");
}
}
}
創(chuàng)新互聯(lián)是一家專業(yè)提供西安企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、網(wǎng)站建設(shè)、HTML5、小程序制作等業(yè)務(wù)。10年已為西安眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。
public synchronized void method(){ //默認使用類實例this當(dāng)做鎖
System.out.println("我是對象鎖也是方法鎖");
}
這種機制確保了同一時刻對于每一個類實例,其所有聲明為 synchronized 的成員函數(shù)中只有一個可執(zhí)行,從而有效避免了類成員變量的訪問沖突
二、類鎖
一個class的靜態(tài)方法和靜態(tài)變量在內(nèi)存中只會加載和初始化一份,一旦一個靜態(tài)的方法被申明為synchronized,此類的所有的實例化對象在調(diào)用該方法時,共用同一把鎖,稱之為類鎖。
形式一:
public class object {
public static synchronized void method(){
System.out.println("我是第一種類鎖");
}
}
形式二:
public class object {
public void method(){
synchronized (object.this) {
System.out.println("我是第二種類鎖");
}
}
}
三、類鎖
ReentrantLock
Lock.lock() 當(dāng)前線程嘗試獲取一個鎖,如果這個鎖獲取不到,則當(dāng)前線程會一直休眠直到獲取這個鎖.
Lock.lockInterruptibly() 讓當(dāng)前線程獲取一個鎖,如果鎖可以用,則直接返回.否則當(dāng)前線程會一直休眠直到一下兩種情況中的其中一個發(fā)生:
當(dāng)前線程獲取到這個鎖
其他線程打斷當(dāng)前線程, 打斷當(dāng)前線程獲取鎖的操作是允許的.
Lock.tryLock() 嘗試獲得一個鎖,如果鎖是可用的,則直接返回ture,并獲取到這個鎖.否則,直接返回false
Lock.tryLock(long time, TimeUnit unit) 在某一段時間內(nèi)嘗試獲取一個鎖,如果鎖可用,則直接返回true,否則等待超時返回fasle
Lock.unlock() 釋放鎖
Lock.newCondition()
網(wǎng)站名稱:Java進階(8)-并發(fā)(多線程鎖類)
網(wǎng)頁地址:http://aaarwkj.com/article46/isjseg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、網(wǎng)站設(shè)計、電子商務(wù)、動態(tài)網(wǎng)站、網(wǎng)站設(shè)計公司、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)