concurrent包簡介 Condition 類

2021-08-22 07:18:35 字數 1538 閱讀 7692

condition的基本使用如下:  

* condition是個介面,基本的方法就是await()和signal()方法;  

* condition依賴於lock介面,生成乙個condition的基本**是lock.newcondition()  

* 呼叫condition的await()和signal()方法,都必須在lock保護之內,就是說必須在lock.lock()和lock.unlock之間才可以  

* 和object.wait()方法一樣,每次呼叫condition的await()方法的時候,當前執行緒就自動釋放了對當前鎖的擁有權  

測試的邏輯設計

// 這段程式的目的是測試先put()後take()的操作,

// 1. 我將conditiondemo的大小設定成5,同時在每次進入notfull和notempty的await()的時候列印一下表示當前執行緒正在等待;

// 2. 先開啟10個執行緒做put()操作,預計有5個執行緒可以完成,另外5個會進入等待

// 3. 主線程sleep10秒中,然後啟動10個執行緒做take()操作;

// 這個時候,首先第乙個take()必然成功完成,在這之前等待的5個put()執行緒都不會被喚醒, 接下來的事情就不好說了;

// 剩下的5個put()執行緒和9個take()執行緒中的任何乙個都可能會被jvm排程;

// 比如可能出現

// a. 開始take()的時候,有5個連續的take()執行緒完成操作; 然後又進入put()和take()交替的情況

// b. 第乙個take()之後,立刻會有乙個put()執行緒被notfull().signal()喚醒; 然後繼續有take()和put()交替的情況;

// 其中take()執行緒也可能進入notempty.await()操作;

// 但是任何時候,未完成的take()執行緒始終》=未完成的put()執行緒, 這個也是很自然的;

// 1. 我將conditiondemo的大小設定成5,同時在每次進入notfull和notempty的await()的時候列印一下表示當前執行緒正在等待;

// 2. 先開啟10個執行緒做take()操作,由於開始conditiondemo裡面沒有東西,所以10個執行緒全部呼叫await進入等待

// 3. 主線程sleep10秒中,然後啟動10個執行緒做put()操作;

// 在第乙個put()完成之後,接下來應該會有部分put()執行緒和take()執行緒先後完成;

// 理論上,

// a. 任何乙個元素的put()都會發生在take()之前;

// b. 如果x表示某個操作成功的次數,在x(put)-x(take)<5的時候,put執行緒不會進入等待狀態

Concurrent併發工具集合簡介

concurrenthashmap 乙個高併發的hashmap copyonwritearraylist 這是乙個list和arraylist是 一族,在讀多寫少的場合,這個list效能非常好 當寫入當時候,先對陣列進行了次複製,arrays.copyof oldarr,len 1 然後setarr...

Concurrent包詳解及使用場景

concurrent包是jdk1.5所提供的乙個針對高併發進行程式設計的包。遵循先進先出 fifo 的原則。阻塞式佇列本身使用的時候是需要指定界限的。在生產者消費者模型中,生產資料和消費資料的速率不一致,如果生產資料速度快一些,消費 處理 不過來,就會導致資料丟失。這時候我們就可以應用上阻塞佇列來解...

頁面切換語言包使用session不用cookie

cookie的問題,ifame中的cookie不一致 在父頁面設定的語言包cookie,在iframe中獲取不到。為什麼呢?為什麼語言包這個事跟cookie過不去,有什麼特殊的?iframe的src請求的時候就得把這個cookie帶到伺服器上去,此時攜帶的是iframe自己的cookie,不是父頁面...