1、cynchronized擴充套件:可重如鎖reentrantlock
reentrantlock是通過cas演算法實現的
renntrantlock lock=new reentrantlock();
lock.lock();//如果資源被占用則會等待
//**鎖定區域
finally{
//必須手動解鎖
lock.unlock();
(1)中斷鎖
reentrantlock 提供了可中斷鎖lockinterruptibly
lock.lockinterruptibly();//會獲得鎖,但是會優先相應中斷
lock.unlock();
當當前執行緒終端會釋放鎖
(2)顯示等待鎖trylock();
trylock()會申請鎖,如果無法獲得鎖,將返回false
trylock也可以設定嘗試一段時間獲取鎖
(3)公平鎖 fair
在建立reentrantlock的時候,有乙個構造方法reentrantlock(boolean fair);預設為false,如果傳入true則表示使用公平鎖
2、condition
condition是搭配reentrantlock搭配使用的,用於控制當前reentrantlock鎖是否釋放,是否被喚起。
reentrantlock lock=new reentrantlock();
condition condition=lock.newcondition();
lock.lock();
condition.await()//會立即釋放lock,進入等待狀態,直到signal或者signalall喚醒;
用法與await基本相同,但是不會在等待過程中響應中斷
//鎖定**
finally
lock.unlock
3、訊號量semaphone,允許多個執行緒同時訪問
reentrantlock和synchronized鎖定之後,至允許乙個執行緒訪問,而semaphone是允許多個執行緒同時訪問;
semaphone(int permits)//permits為許可數量,允許同時有permits訪問
semaphone(int permits,boolean fair)//fair表示是否公平
semaphone中的主要方法有
acquire();嘗試獲得乙個許可,如果無法獲得,則會等待;
release();當執行緒執行完成之後釋放乙個許可
tryacquire();嘗試獲得乙個許可,如果獲取到返回true;否則返回false;
tryacqurie(timeout,unit);在制定時間內嘗試獲得乙個許可;
acquireuninterrupt();用法與acquire一致,但是不會相應中斷;
4、readwritelock讀寫鎖
readwritelock適用於大量讀,少量寫的操作
讀與讀之間不阻塞,讀與寫阻塞,寫與寫阻塞
readwritelock就是同時只允許有乙個執行緒寫,但是多個執行緒可以同時讀,不能一邊讀一邊寫。
readwritelock rwl=new readwritelock();
lock readlock=wrl.readlock();
readlock.lock();
//**
readlock.unlock();
lock writelock=wrl.readlock();
writelock.lock();
//**
writelock.unlock();
5、countdownlock 倒計時器
主要用於控制等待執行緒,通過countdownlock(int count);指定計數器個數,表示有count個執行緒執行完成之後,才能執行當前(main中的)主線程;
通過await()檢查,呼叫await之後當前執行緒會等待,知道執行完指定個數的執行緒;
6、迴圈柵欄cyclicbarrier
cyclicbarrier(int parties,runable barrieraction) parties為執行緒數,barrieraction為執行緒執行完成之後的通知執行緒
cyclicbarrier會集合夠parties個執行緒之後,讓他們同時執行,執行完成之後通過barrieraction通知。
cyclicbarrier主要作用是保證parties個執行緒執行同步,第一次呼叫await方法會集合執行緒,第二次呼叫會await集體執行成功通知barrieraction
cyclicbarrier柵欄中的某乙個執行緒被中斷,會影響其他執行緒的執行,會丟擲brokenbarrierexception。
問題:當cyclicbarrier中某乙個執行緒執行過程中被中斷,其他執行緒會執行成功嗎?
7、locksupport執行緒阻塞工具類
locksupport可以讓乙個執行緒在任何乙個地方中斷,功能類似與thread的supend和resume,thread中如果resume在supend之前,會導致執行緒永久掛起,
使用locksupport的pack和unpack則不會發生這種情況。locksupport是使用訊號量機制,為每個執行緒建立了乙個許可,及時unpack執行在pack之後,unpack會建立乙個許可,pack執行會消耗這個許可,會立即返回。locksupport被中斷之後是不會跑出interruptedexception,但是會同步執行緒狀態,thread.isinterrupted()
java 併發工具包 BlockingQueue
blockingqueue 是乙個介面,字義上理解表示為乙個阻塞佇列 1 生產者入隊 2 消費者出隊 blockingqueue 具有 4 組不同的方法用於插入 移除以及對佇列中的元素進行檢查。如果請求的操作不能得到立即執行的話,每個方法的表現也不同。這些方法如下 拋異常 特定值 阻塞 超時 四組不...
併發工具包 阻塞佇列BlockingQueue
阻塞佇列,顧名思義 如果佇列滿了,那麼會進入阻塞狀態,當有消費者從佇列中取出資料後,再解除阻塞狀態。如果隊列為空,從佇列中取資料就會進入阻塞狀態。直至佇列中有資料為止。blockingqueue是介面,目前已知的實現類如下 arrayblockingqueue 底層底層通過陣列來儲存佇列中的元素,所...
Python之爬蟲工具包
requests包 是乙個實用的python的http客戶端庫,編寫爬蟲從web上爬取資料時經常用到 簡單實用,介面簡單 requests.get url lxml包 主要用來解析通過requests抓取的html內容,從中提取出我們需要的資料,在對html文字內容進行提取 篩選時用到的是xpath...