教你使用BooleanLock,多個線程通過lock方法爭搶鎖的方法

2020-12-25 編程小課堂

充分利用wait、notify方法的功能,實現一個顯式鎖,可中斷被阻塞的線程。在使用該顯式鎖的時候,務必藉助於try finally語句來確保每次獲取到鎖之後都可以正常的釋放,使用BooleanLock,多個線程通過lock方法爭搶鎖示例代碼如下:

package com.wangwenjun.concurrent.chapter05;

import java.util.concurrent.TimeUnit;

import java.util.stream.IntStream;

import static java.lang.Thread.currentThread;

import static java.util.concurrent.ThreadLocalRandom.current

public class BooleanLockTest

{

//定義BooleanLock

private final Lock lock=new BooleanLock();

//使用try..finally語句塊確保lock每次都能被正確釋放

public void syncMethod()

{

//加鎖

lock.lock();

try

{

int randomInt=current().nextInt(10);

System.out.printin(currentThread()+"get the 1)

TimeUnit.SECONDS.sleep(randomInt);

}catch(InterruptedException e)

{

e.printStackTrace();

}finally

{

//釋放鎖

1ock.unlock();

}

}

public static void main(String[]args)

{

BooleanLockTest blt=new BooleanLockTest();

//定義一個線程並且啟動

IntStream.range(0,10)

.mapToObj(i->new Thread(blt::syncMethod))

.forEach(Thread::start);

}

}

根據以上代碼輸出可以看到,每次都會確保只有一個線程能夠獲得鎖的執行權限,這一點已經與synchronized同步非常類似。以上就是使用BooleanLock,多個線程通過lock方法爭搶鎖的示例代碼了。

相關焦點

  • 使用Lock鎖:java多線程安全問題解決方案之Lock鎖
    實現提供了比使用 synchronized 方法和語句可獲得的更廣泛的鎖定操作,就來釋放鎖和獲取鎖來說,在使用synchronized 方法的時候,我們並不知道什麼時候獲取到了鎖,什麼時候釋放了鎖,而Lock接口不一樣,他提供了專門的獲取鎖和釋放鎖的方法。
  • Lock鎖 精講
    但是,某些鎖可能允許並發訪問共享資源,例如ReadWriteLock的讀取鎖。使用synchronized方法或語句可訪問與每個對象關聯的隱式監視器鎖,但會強制所有鎖的獲取和釋放以塊結構方式進行。當獲取多個鎖時,它們必須以相反的順序釋放鎖。
  • Java中synchronized鎖和lock鎖的比較
    是JVM層面的鎖。Lock:是JDK5以後才出現的具體的類。使用lock是調用對應的API。是API層面的鎖sync是底層是通過monitorenter進行加鎖(底層是通過monitor對象來完成的,其中的wait/notify等方法也是依賴於monitor對象的。
  • 5個步驟,教你瞬間明白線程和線程安全
    ,多個線程同時訪問會不會出現什麼問題,我開啟的3條線程,每個線程循環10次,得到以下結果:我們可以看到,這裡出現了兩個26,出現這種情況顯然表明這個方法根本就不是線程安全的,出現這種問題的原因有很多。其實要對線程安全問題給出一個明確的定義,還是蠻複雜的,我們根據我們這個程序來總結下什麼是線程安全。當多個線程訪問某個方法時,不管你通過怎樣的調用方式、或者說這些線程如何交替地執行,我們在主程序中不需要去做任何的同步,這個類的結果行為都是我們設想的正確行為,那麼我們就可以說這個類是線程安全的。
  • C++11線程、鎖和條件變量
    接下來的這個例子演示的是一個簡單的線程安全的容器(內部使用的是std::vector)。這個容器具有添加單個元素的add()方法以及添加一批元素的addrange()方法,addrange()方法內只是簡單的調用了add()方法。
  • 探索 Android 多線程優化方法 | 開發者說·DTalk
    顯示鎖獲取鎖的四個方法lock(): 獲取鎖,獲取失敗時線程會處於阻塞狀態。適用場景: 在多個線程持有鎖的平均時間不長的情況下我們可以使用內部鎖。在多個線程持有鎖的平均較長的情況下我們可以使用顯式鎖 (公平鎖)。讀寫鎖鎖的排他性使得多個線程無法以線程安全的方式在同一時刻讀取共享變量,這樣不利於提高系統的並發性,這也是讀寫鎖出現的原因。
  • ReentrantLock核心原理,絕對乾貨
    不知道也沒關係,看完這篇文章通過你的思考,能找到答案哦那我們開始吧ReentrantLock 中文我們叫做可重入互斥鎖,可重入的意思是同一個線程可以對同一個共享資源重複的加鎖或釋放鎖,互斥就是 AQS 中的排它鎖的意思,只允許一個線程獲得鎖
  • 可重入讀寫鎖ReentrantReadWriteLock的使用詳解
    ReentrantReadWriteLock是一把可重入讀寫鎖,這篇文章主要是從使用的角度幫你理解,希望對你有幫助。一、性質1、可重入如果你了解過synchronized關鍵字,一定知道他的可重入性,可重入就是同一個線程可以重複加鎖,每次加鎖的時候count值加1,每次釋放鎖的時候count減1,直到count為0,其他的線程才可以再次獲取。
  • C++11多線程編程(三)——lock_guard和unique_lock
    如果熟悉C++多線程的童鞋可能有了解到實現的互斥鎖的機制還有這個寫法lock_guard<
  • 這篇 ReentrantLock 你可以看得懂!
    明白了吧,再來測試一下非公平鎖的流程,看看是不是你想要的結果。公平鎖的加鎖(lock)流程詳解通常情況下,使用多線程訪問公平鎖的效率會非常低(通常情況下會慢很多),但是 ReentrantLock 會保證每個線程都會公平的持有鎖,線程飢餓的次數比較小。
  • 面試官:不使用synchronized和lock,如何實現一個線程安全的單例?
    稍微了解一點單例的朋友也都知道實現單例是要考慮並發問題的,一般情況下,我們都會使用synchronized來保證線程安全。那麼,如果有這樣一道面試題:不使用synchronized和lock,如何實現一個線程安全的單例?你該如何回答?C類應聘者:可以使用餓漢模式實現單例。
  • 「轉載」java架構之路(多線程)synchronized詳解以及鎖的膨脹升級...
    (){ UnsafeInstance.reflectGetUnsafe().monitorExit(obj); }}就是我們上次說的unsafe那個類給我們提供了加鎖和解鎖的方法,這樣就是實現誇方法的加鎖和解鎖了,但是超級不建議這樣的使用,後面的AQS回去說別的方式。
  • 深入理解ReentrantLock的實現原理
    非公平鎖的實現原理當我們使用無參構造方法構造的時候即ReentrantLock lock = new ReentrantLock(),創建的就是非公平鎖。new FairSync() : new NonfairSync();}lock方法獲取鎖lock方法調用CAS方法設置state的值,如果state等於期望值0(代表鎖沒有被佔用),那麼就將state更新為1(代表該線程獲取鎖成功),然後執行setExclusiveOwnerThread方法直接將該線程設置成鎖的所有者。
  • UNIX(多線程):10---線程unique_lock(下)
    " << std::endl;return 0;}unique_lock的第二個參數std::adopt_lockstd::lock_guard<std::mutex> abguard1(my_mutex1, std::adopt_lock); //adopt_lock標記作用;表示這個互斥量已經被lock了(你必須要把互斥量提前
  • 徹底理解ReentrantLock可重入鎖的使用
    二、使用1、簡單使用我們先給出一個最基礎的使用案例,也就是實現鎖的功能。在這裡我們定義了一個ReentrantLock,然後再test方法中分別lock和unlock,運行一邊就可以實現我們的功能。這就是最簡單的功能實現,代碼很簡單。
  • 手把手教你實現基於Redis的分布式鎖
    執行test.py測試腳本,得到的結果如下:觀察輸出結果發現,同時有多個線程輸出的結果是一樣的。初看上面加鎖的代碼邏輯似乎沒什麼問題,但是最終的結果卻事與願違,原因是上面的代碼get(lock_key)和set(lock_key, '1')並不是原子性的執行,而是分開執行。
  • Linux Qt使用POSIX多線程條件變量、互斥鎖(量)
    比如說需要對線程間共享的數據提供保護,使用互斥量同步、使用條件變量、使用讀寫鎖同步等;各種同步方式用在什麼情況下,開始編程時多線程使用的並不多,無法切身體會到這些問題,後來程序寫的多了一點兒,慢慢接觸到一些多線程的東西,並且自己也可以學習了相關知識,並用到實際程序中。好了,下面以一個實際的例子為背景,來說明Linux POSIX多線程的一些特性。
  • 由淺入深講解JUC下 CAS + Lock
    問題描述:當對一個共享變量執行操作時,我們可以使用循環CAS的方式來保證原子操作,但是對多個共享變量操作時,循環CAS就無法保證操作的原子性,這個時候就可以用鎖來保證原子性。PS 可重入含義:同一線程外層函數獲得鎖後,內層遞歸函數仍能獲取該鎖的代碼。在同一個線程在外層方法獲取鎖的時候,在進入內層方法會自動獲取鎖。也就是說,線程可以進入任何一個它已經擁有的鎖所同步的代碼塊。
  • Java並發編程系列21|Condition-Lock的等待通知
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫我們知道 synchronized 鎖通過 Object 類的 wait()和 notify()方法實現線程間的等待通知機制,而比 synchronized 更靈活 Lock 鎖同樣也有實現等待通知機制的方式
  • 面試官:你說說ReentrantLock和Synchronized區別
    使用方式Synchronized可以修飾實例方法,靜態方法,代碼塊。自動釋放鎖。ReentrantLock提供公平和非公平兩種鎖,默認是非公平的。公平鎖通過構造函數傳遞true表示。其中lockInterruptibly方法表示可中斷,lock方法表示不可中斷。