如何线程安全地操作 Java 中的列表?
How to thread-safely manipulate lists in Java?
我有一个带链表的简单 class:
private final LinkedList<Object> list;
如果我有两种方法来操作这个列表:
public void m1(){ ... list.poll()...}
public void m2(){...list.clear)....}
如何确保线程安全?两种方法都接收 "synchronized" 关键字就足够了吗,还是我需要输入
synchronized(list){
System.out.println("locking on :" + lock);
}
围绕方法代码?
常识告诉我这是第二个,但我想要确认,或者更简单的方法来确保我的列表不会被弄乱。
PS:还是放在 CodeReview 中会更好?不知何故,这里感觉更合适。
将您的列表传递给 java.util.Collections
class 中的 public static <T> List<T> synchronizedList(List<T> list)
方法以创建线程安全列表。
java.util.Vector
是线程安全的,class中的所有方法都是synchronized
最好让同步尽可能具体,而不是用关键字标记整个方法。同步越精细,代码的性能就越好。在线程间使用列表时,应该建议您显示的后一个代码并在同一个锁上同步。
对于您的情况,如果您按照下面的说明进行操作,应该没问题:
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.
}
提示:如果您要实施某种 Producer/Consumer 模式,请使用现有工具 - class 实施 "Blocking Queue" 应该适合您的需要
我有一个带链表的简单 class:
private final LinkedList<Object> list;
如果我有两种方法来操作这个列表:
public void m1(){ ... list.poll()...}
public void m2(){...list.clear)....}
如何确保线程安全?两种方法都接收 "synchronized" 关键字就足够了吗,还是我需要输入
synchronized(list){
System.out.println("locking on :" + lock);
}
围绕方法代码?
常识告诉我这是第二个,但我想要确认,或者更简单的方法来确保我的列表不会被弄乱。
PS:还是放在 CodeReview 中会更好?不知何故,这里感觉更合适。
将您的列表传递给 java.util.Collections
class 中的 public static <T> List<T> synchronizedList(List<T> list)
方法以创建线程安全列表。
java.util.Vector
是线程安全的,class中的所有方法都是synchronized
最好让同步尽可能具体,而不是用关键字标记整个方法。同步越精细,代码的性能就越好。在线程间使用列表时,应该建议您显示的后一个代码并在同一个锁上同步。
对于您的情况,如果您按照下面的说明进行操作,应该没问题:
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.
}
提示:如果您要实施某种 Producer/Consumer 模式,请使用现有工具 - class 实施 "Blocking Queue" 应该适合您的需要