JDK同步控制工具,JAVA高併發程式設計

2021-08-02 00:16:28 字數 2420 閱讀 9144

同步控制是併發程式的重要手段之一,我們平常用過最多的synchronized就是其中一種簡單的方法,此外還有object.wait(),object.notify()等方法。在jdk之中,還有其他好用的工具。

乙個可重入的互斥鎖lock,它具有與使用synchronized方法和語句所訪問的隱式監視器鎖相同的一些基本行為和語義,但功能更強大。reentrantlock將由最近成功獲得鎖,並且還沒有釋放該鎖的執行緒所擁有。當鎖沒有被另乙個執行緒所擁有時,呼叫lock的執行緒將成功獲取該鎖並返回。如果當前執行緒已經擁有該鎖,此方法將立即返回。可以使用isheldbycurrentthread()getholdcount()方法來檢查此情況是否發生。舉個栗子:

public

class

demo_1

implements

runnable catch (exception e) finally }}

public

static

void

main(string args) throws exception

}

使用重入鎖,在併發時,保護i的安全性。重入鎖還有乙個特點,跟它的名字一樣,可以反覆進如入:
for (int j = 0; j < 1000000; j++)  catch (exception e) finally 

}

跟synchronized相比,重入鎖有顯示操作,必須手動指定何時加鎖和釋放鎖,對邏輯控制的靈活性要好於synchronized,唯一注意的就是必須釋放鎖。另外,重入鎖還可以提供中斷功能。使用synchronized時,乙個執行緒在等待鎖,最後結果就兩種,要麼獲得鎖,要麼一直等待下去,這種情況對於實際業務需求來講,並不友好。比如你朝思暮想的女朋友來看你了,在這種乾柴烈火,風花雪月,月黑風高的時候,你正準備幹點什麼,女朋友親戚來了,這時候你難道要一直等下去嗎,那肯定不行,當然是停下來,然後開始學習
public

class

demo_2

implements

runnable

@override

public

void

run() catch (exception e)

rlockb.lockinterruptibly();

} else catch (exception e)

rlocka.lockinterruptibly();

}} catch (exception e) finally

}public

static

void

main(string args) throws exception

}

當ra和rb同時執行,ra先占用locka,再占用lockb,而rb先占用lock2,再占用locka,這樣就形成了相互等待。在這裡,我們使用了lockinterruptibly()這個方法,這是乙個可以對中斷,休眠的執行緒進行響應的鎖申請操作。

在上面的列子中,lockinterruptibly()的優先作用是響應中斷,就好比有個**深入敵後,隨時執行外面給的命令,因為外面的人進不來。最後我們呼叫了interrupt方法,來中斷rb執行緒,那麼rb就會放棄locka鎖的申請,同時釋放lockb的鎖,這樣ra就可以繼續執行下去了。

除了這種等待外部通知外,還提供了一種其他方法:限時等待。顧名思義,就是在指定時間內,執行緒會一直等待鎖的獲取,超出時間就不再等待了。這裡我們用trylock()來實現:

public

class

demo_3

implements

runnable

@override

public

void

run() else

} catch (exception e) finally }}

public

static

void

main(string args)

}

trylock() 的兩個引數也很好理解,乙個是等待時長,另乙個就是時間單位。如果不帶引數,就表示不等待,如果當前鎖沒有被其他執行緒占用,就直接返回true,反之直接返回false。

使用synchronized的時候,我們可以用wait()和notify()方法來達到控制線程的目的。同樣的在重入鎖中,也有類似的方法,await(),awaituninterruptibly()和singal()。

各種同步控制工具的使用

共享鎖,執行多個執行緒同時臨界區 public void acquire public void acquireuninterruptibly public boolean tryacquire public boolean tryacquire long timeout,timeunit unit...

實戰Java高併發程式設計(三)JDK並發包

同步控制 重入鎖 重入鎖可以完全替代synchronized關鍵字。其使用方法如下 public reentrantlock lock new reentrantlock public void run finally 由於其通過人工進行lock和unlock,因此比synchronized更好控制...

JAVA中常用的JDK命令工具學習

1.jps 虛擬機器程序狀況工具 可以列出正在執行的虛擬機器程序,並顯示虛擬機器執行主類 main class,main 函式所在的類 名稱以及這些程序的本地虛擬機器唯一id local virtual machine iderifier,lvmid jps命令格式 jps options host...