我有一个带链表的简单类:
private final LinkedList<Object> list;
如果我有两种操作此列表的方法:
public void m1(){ ... list.poll()...}
public void m2(){...list.clear)....}
如何确定ThreadSafety?这两种方法是否足以接收&#34; synchronized&#34;关键字,或者我需要放一个
synchronized(list){
System.out.println("locking on :" + lock);
}
围绕方法代码?
常识告诉我它是第二个,但我想要确认,或者更简单的方法来确保我的列表不会搞砸。
PS:或者这会更好地放在CodeReview中?不知何故,感觉更加适合。
答案 0 :(得分:5)
将您的列表传递给public static <T> List<T> synchronizedList(List<T> list)
类中的java.util.Collections
方法,以创建一个线程安全列表。
答案 1 :(得分:2)
最好使同步尽可能具体,而不是使用关键字标记整个方法。同步越精细,代码执行得越好。在线程中使用列表时,应该建议您显示的后一个代码并在同一个锁上同步。
如果您的情况如下所示,如您所示,它应该没问题:
synchronized(list){
// do something with your list
// synchronizing on the same lock makes sure other threads have to wait for this lock
// to be released. In your case you are using the list object as the lock.
}
答案 2 :(得分:1)
java.util.Vector
是线程安全的,此类中的所有方法都是synchronized
答案 3 :(得分:1)
提示:如果您要实现某种生产者/消费者模式,请使用现有工具 - 实施"Blocking Queue"的类应满足您的需求