Re: [問題] synchronized 和 multi thread
※ 引述《jehovah (Lucius)》之銘言:
: 大家好, 小弟對multi thread還不熟悉, 想請教一個問題
: 目前我有A, B兩條thread, 以及一個公用的arraylist
: A thread會做以下的工作:
: arraylist.remove(old_index);
: ...一些運算
: arraylist.add(new_index, obj);
: B thread則會對arraylist作get
: 因此A在作add前, B有機會IndexOutOfBounds
: 我查了synchronized修飾字,
: 將A的工作用synchronized包起來, 可是沒有幫助
: synchronized(arraylist){
: ...
: }
: 我是希望鎖住arraylist這個物件, 而不是操作這物件的Method
: 請問一般來說, 這種狀況如何處理較恰當?
: 可否給我點建議, 或是該往哪個方向去查..謝謝:)
ReentrantLock arrLock = new ReentrantLock();
ArrayList<Object> arrList = new ArrayList();
public Object arrGet(int i)
{
arrLock.lock();
try
{
return arrList.get(i);
}
finally
{
arrLock.unlock();
}
}
public void arrSet(Object obj)
{
arrLock.lock();
try
{
arrList.add(obj);
}
finally
{
arrLock.unlock();
}
}
關鍵字:Lock
這是比synchronized麻煩,但比synchronized的彈性更大的東西
例如:
if (arrLock.trylock())try
{
//TODO 成功鎖定物件後要做的事
}
finally
{
arrLock.unlock();
}
else
{
//TODO 萬一物件被別條執行緒鎖定時要做的事
}
Thinking in JAVA有比較詳細的說明
另外,這個東西使用上有個要注意的地方
根據自己使用上的經驗
如果在try中噴出錯誤的話,仍然跑finally中的程式碼去解鎖
但如果執行緒在中途被砍掉的話,有可能就一直鎖在那邊
所以請不要在執行緒還在try區塊當中時,去砍執行緒
(那時候把lock設成static,又遇到程式出錯誤,去用android的工具中斷掉程式
再次執行程式就發現lock還被鎖著)
可能有防止的辦法吧....
但因為我沒砍執行緒的需求,就沒深入研究
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.233.156.87
→
10/05 00:29, , 1F
10/05 00:29, 1F
推
10/05 00:32, , 2F
10/05 00:32, 2F
→
10/05 00:33, , 3F
10/05 00:33, 3F
推
10/06 01:20, , 4F
10/06 01:20, 4F
推
10/07 01:47, , 5F
10/07 01:47, 5F
→
10/07 01:50, , 6F
10/07 01:50, 6F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 3 篇):