如何在Java中线程安全地操作列表?

时间:2015-01-08 11:17:36

标签: java thread-safety

我有一个带链表的简单类:

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中?不知何故,感觉更加适合。

4 个答案:

答案 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"的类应满足您的需求