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

如何在Java中线程安全地操作列表?,java,thread-safety,Java,Thread Safety,我有一个带有链表的简单类: private final LinkedList<Object> list; 如何确保螺纹安全?让这两个方法都接收“synchronized”关键字就足够了吗,还是我需要输入一个 synchronized(list){ System.out.println("locking on :" + lock); } 关于方法代码 常识告诉我这是第二个,但我想确认一下,或者用一种更简单的方法来确保我的清单不会弄乱 PS:或者这会更好地放在CodeRev

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

private final LinkedList<Object> list;
如何确保螺纹安全?让这两个方法都接收“synchronized”关键字就足够了吗,还是我需要输入一个

synchronized(list){
    System.out.println("locking on :"  + lock);
}
关于方法代码

常识告诉我这是第二个,但我想确认一下,或者用一种更简单的方法来确保我的清单不会弄乱


PS:或者这会更好地放在CodeReview中?它在这里感觉更合适。

将列表传递给
java.util.Collections
类中的
公共静态列表同步列表(list list)
方法,以创建线程安全列表。

将列表传递给
公共静态列表同步列表(list list)
java.util.Collections
类中的
方法来创建线程安全列表。
java.util.Vector
是线程安全的,该类中的所有方法都是
同步的

java.util.Vector
是线程安全的,该类中的所有方法都是
同步的

最好使同步尽可能具体,而不是用关键字标记整个方法。同步越精细,代码的性能就越好。当在线程之间使用列表时,应该建议显示后一个代码,并在同一个锁上进行同步

与您的情况一样,如果您按照如下所示进行操作,则应该可以:

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

最好使同步尽可能具体,而不是用关键字标记整个方法。同步越精细,代码的性能就越好。当在线程之间使用列表时,应该建议显示后一个代码,并在同一个锁上进行同步

与您的情况一样,如果您按照如下所示进行操作,则应该可以:

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

提示:如果要实现某种生产者/消费者模式,请使用现有的工具-类实现应该适合您的需要

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

需要查看没有peek/poll的列表是否在我的环境中工作,但这个小片段确实有用,以前从未见过:)需要查看没有peek/poll的列表是否在我的环境中工作,但这个小片段确实有用,以前从未见过:)我建议只在关键部分使用
Synchronized
,如
poll
clear
,而不是在整个方法上。还有,像
add()
remove()
这样的方法呢?。您还必须对它们进行同步吗?好的,首先:谢谢,所有的答案都很有用:)。由于“这周围有一个现有系统”的情况,我最终同步了重要的块。对于几乎所有其他情况,我要指出的是atish shimpi@最后一点:你是完全正确的,只是碰巧我所处理的案例中有peek、poll和clear,所以它们在示例中结束了!问题是当一个线程调用
add()
而您在另一个线程中调用
clear()
时。肯定会有矛盾。最好使用
Collections.synchronizedList()
@TheLostMind(以及任何觉得能够回答^^^的人):这不是我将synchronized(list){}块放在add、clear、poll等周围的原因吗,这样我就可以使用非synchronized(list)块了?我不确定你是在澄清我问题的范围,还是我遗漏了什么!我建议只在关键部分使用
Synchronized
,如
poll
clear
,而不是在整个方法上使用
add()
remove()
?。您还必须对它们进行同步吗?好的,首先:谢谢,所有的答案都很有用:)。由于“这周围有一个现有系统”的情况,我最终同步了重要的块。对于几乎所有其他情况,我要指出的是atish shimpi@最后一点:你是完全正确的,只是碰巧我所处理的案例中有peek、poll和clear,所以它们在示例中结束了!问题是当一个线程调用
add()
而您在另一个线程中调用
clear()
时。肯定会有矛盾。最好使用
Collections.synchronizedList()
@TheLostMind(以及任何觉得能够回答^^^的人):这不是我将synchronized(list){}块放在add、clear、poll等周围的原因吗,这样我就可以使用非synchronized(list)块了?我不确定你是在澄清我问题的范围,还是我遗漏了什么!