Java 中鎖機制是實現(xiàn)多線程同步的一種重要手段,鎖的類型分為阻塞鎖和非阻塞鎖。在 Java 中,synchronized 是一種阻塞鎖,而 ReentrantLock 是一種非阻塞鎖。
阻塞鎖是一種悲觀鎖,它會在運行時發(fā)生阻塞,等待其他線程操作結(jié)束才能繼續(xù)執(zhí)行,在高并發(fā)場景下,它的性能相對較低。例如下面這段代碼:
public synchronized void method1() { // 等待執(zhí)行某個操作 // .... }
其中 synchronized 關(guān)鍵字表示該方法是一個阻塞鎖,當(dāng)一個線程獲得該鎖時,其他線程將阻塞,直到該線程執(zhí)行完畢。
非阻塞鎖則是一種樂觀鎖,它能夠在遭遇競爭時,快速地釋放鎖和獲取鎖,避免了線程的阻塞。例如下面這段代碼:
Lock lock = new ReentrantLock(); public void method2() { lock.lock(); try { // 獲得鎖后執(zhí)行某個操作 // .... } finally { lock.unlock(); } }
其中 ReentrantLock 是一種非阻塞鎖,它允許線程在同一時刻多次獲得鎖,同時又能保證在釋放之前,所有的線程都不能獲得該鎖。
在使用鎖的時候,我們需要根據(jù)具體場景來選擇合適的鎖,阻塞鎖適合在鎖被持有期間的操作時間較長的場景下使用,而非阻塞鎖適合在鎖被持有期間的操作時間較短的場景下使用。