2015-01-08 30 views
1

我有一个简单的类用链表:如何在Java中线程安全地操作列表?

private final LinkedList<Object> list; 

如果我有两种方法操纵这个名单:

public void m1(){ ... list.poll()...} 

public void m2(){...list.clear)....} 

如何确保ThreadSafety的?这两种方法是否足以接收“同步”关键字,或者我是否需要在方法代码周围放置一个“方法代码”?

常识告诉我它是第二个,但我想确认,或者更简单的方法来确保我的列表不会被搞砸。

PS:或者这会更好地放在CodeReview?不知何故,这里感觉更为合适。

+1

我会建议使用'同步'只在'轮询'和'清除'而不是在整个方法的关键部分。 – TheLostMind

+0

另外,像add()'和remove()'?这样的方法呢?你将不得不同步*在它们上面? – TheLostMind

+0

好的,首先:谢谢,所有的答案都有帮助:)。由于“有一个现有的系统”的情况下,我最终同步块重要。对于几乎所有其他情况,我会指出atish shimpi http://stackoverflow.com/a/27838890/2286132。 @TheLostMind:你是完全正确的,它恰好是这样,我正在处理的情况下偷看,轮询和清除,所以他们最终在这个例子中! – Layna

回答

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. 
} 
5

将您的列表传递给java.util.Collections类中的public static <T> List<T> synchronizedList(List<T> list)方法以创建线程安全列表。

+0

需要看看没有peek/poll的列表是否可以在我的环境中工作,但这个小片段肯定是有用的,从来没有见过它:) – Layna

1

java.util.Vector是线程安全的,在这个类中的所有方法都是​​

1

提示:如果你要实现某种生产者/消费者模式,利用现有的工具 - 类实施"Blocking Queue"应该适合您的需求