作者jehovah (Lucius)
看板java
标题[问题] synchronized 和 multi thread
时间Tue Oct 4 22:57:39 2011
大家好, 小弟对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
请问一般来说, 这种状况如何处理较恰当?
可否给我点建议, 或是该往哪个方向去查..谢谢:)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 1.169.177.29
1F:推 tomap41017:thread b call arraylist.wait() 10/04 23:02
2F:→ tomap41017:在A thread做完之後去call arraylist.notifyAll() 10/04 23:04
3F:→ dou0228:未看先猜 ArrayList 不是 Collections.synchronizedList() 10/05 00:41
4F:→ dou0228:List l=Collections.synchronizedList(new ArrayList()); 10/05 00:44
5F:→ dou0228:... synchronized(list) { ... } 10/05 00:46
6F:→ jehovah:谢谢^^ 那请问用vector来做是否也可行? 10/05 00:48
7F:→ dou0228:可,因为 Collections.synchronizedList 传入 List<T> list 10/05 00:51
8F:→ jehovah:抱歉再请教, 若为ArrayList<ArrayList<String>> 10/05 10:20
9F:→ jehovah:则Collections.synchronizedList会确保两层同步吗? 10/05 10:22
10F:→ jehovah:我测试了一下, 结果是内外独立的 10/05 10:54
11F:→ dou0228:内外独立正常,两层都要 用 Collections. 来建才会 sync. 10/05 10:55
12F:推 dream1124:你可以用concurrent package 里面写好的资料结构 10/05 11:00
13F:→ jej:要先确定起的这个物件是不是唯一的.. 不是唯一的就锁不起来 10/06 20:54