作者LaPass (LaPass)
看板java
标题Re: [问题] synchronized 和 multi thread
时间Tue Oct 4 23:27:15 2011
※ 引述《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
1F:→ LaPass:补一下 java.util.concurrent 底下有许多执行绪安全的容器 10/05 00:29
2F:推 jehovah:谢谢..这个东西好酷 10/05 00:32
3F:→ LaPass:可用,你可以去翻看看有没有适合的可用 10/05 00:33
4F:推 tomap41017:推concurrent,不需要自己写 10/06 01:20
5F:推 jehovah:谢谢解答, 我用CopyOnWriteArrayList可以解掉问题:) 10/07 01:47
6F:→ jehovah:另外我有疑问vector可否代替CopyOnWriteArrayList?差异是? 10/07 01:50