如何在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)块了?我不确定你是在澄清我问题的范围,还是我遗漏了什么!