java鎖的介紹

java中的鎖
鎖使用來控制共享資源的方式,一般來來說,一個鎖能夠防止多個線程同時訪問共享資源,在lock接口之前,java程序
是靠synchronized 關鍵字來實現鎖的功能的,而javase 5 之後,併發包新增了lock接口來實現相關功能,
Lock接口提供的synchronized關鍵字不具備的主要特性
特性:嘗試非阻塞獲取鎖:當前線程獲取鎖,如果這一時刻鎖沒有被其他線程獲取到,則成功獲取鎖並持有鎖
能夠不斷地獲取鎖: 與synchronized不同,獲取鎖的線程能夠響應中斷,當獲取到鎖的線程被中斷時,中斷
異常將會被拋出,同時鎖會被釋放
超時獲取鎖:指定的截止時間之前獲取鎖,如果截止時間到了仍舊無法獲取鎖,則返回
隊列同步器
隊列同步器AbstractWueuedSynchronizer,是用來構建鎖或者其他同步組件的基礎框架,它使用了一個int成員變量
表示同步狀態,通過內置的FIFO隊列來完成資源獲取線程的排隊工作
隊列同步器的接口與實例

public class TestLock implements Lock {
//自定義同步器
private static class Sync extends AbstractQueuedSynchronizer{
//是否處於佔用狀態
@Override
protected boolean isHeldExclusively() {
return getState()==1;
}
//當狀態爲0時獲取鎖
@Override
protected boolean tryAcquire(int arg) {
if(compareAndSetState(0,1)){
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
//釋放鎖 將狀態設置爲0
@Override
protected boolean tryRelease(int arg) {
if (getState()==0) throw new IllegalArgumentException();
setExclusiveOwnerThread(null);
setState(0);
return true;
}
//每個condition都包含一個conditon隊列
Condition newCondition(){
return new ConditionObject();
}
}
//將操作設置到代理上
private final Sync sync =new Sync();
@Override
public void lock() {
sync.acquire(1);
}

@Override
public void lockInterruptibly() throws InterruptedException {
    sync.acquireInterruptibly(1);
}

@Override
public boolean tryLock() {
    return false;
}

@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
    return sync.tryAcquire(1);
}

@Override
public void unlock() {
    sync.release(1);
}

@Override
public Condition newCondition() {
    return sync.newCondition();
}

}
隊列同步器的分析與實現
依賴內部的同步隊列來完成同步狀態的管理,當前線程獲取同步狀態是失敗時,同步器會將當前線程以及等待狀態等
信息構成爲一個節點並將其加入同步隊列,同時會阻塞當前線程,同步釋放狀態時,會把首節點中的線程喚醒,使其
再次獲取同步狀態。
int waitStatus: Cancelled 值爲1,由於同步狀態中等待的超時或者被中斷,需要從同步隊列取消等待,節點進入
該狀態不會發生變化。
signal:值爲-1,後續節點的線程處於等待狀態,而當前節點釋放了同步狀態或者被取消,將會通知後繼節點,使
後繼節點的線程的得以運行
conditon:值爲-2,節點在等待隊列
propagate:值爲-3,表示下一次共享同步狀態將會無條件地被傳播下去
inital,值爲0,初始狀態
獨佔式同步狀態獲取與釋放
通過同步器的acquire(int arg)方法獲取同步狀態,該方法對中斷不敏感,也就是由於線程獲取同步狀態失敗後
則進入同步隊列中,後續對線程中斷操作是,線程不會從同步隊列中移出
重入鎖
從進入是指任意線程在獲取鎖之後能夠再次獲取該鎖而不會被阻塞
線程再次獲取鎖
鎖的最終釋放
公平鎖與非公平鎖的區別
鎖的順序就該符合請求絕對時間順序
讀寫鎖
參考方騰飛老師的《併發編程藝術》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章