我不确定如何正确使用Collections.synchronizedList()实现。
我有这两个:
public synchronized static List<CurrencyBox> getOrderList() {
return Collections.synchronizedList(orderList);
}
和
public static List<CurrencyBox> getOrderList() {
return Collections.synchronizedList(orderList);
}
据我所知,synchronizedList确实返回orderList而不是副本,对吗?
所以如果我想保证原子操作,比如添加和删除,上面的哪个实现是正确的?
使用Java9可能会有什么变化吗?或者它仍然是要走的路还是你有任何其他建议吗?
谢谢
答案 0 :(得分:2)
没有上下文,有点难以分辨,从提供的片段中都没有给你保证原子操作。
文档说明:
返回由指定的支持的同步(线程安全)列表 名单。为了保证串行访问,所有这一切至关重要 访问后备列表是通过返回的列表完成的。
因此,即使您同步该方法,您将获得的最佳结果是保证没有两个对象同时创建同步列表。
您需要将原始的orderList
与Collections.synchronizedList
打包开始,并且每次都返回该存储的结果。
private static List<CurrencyBox> orderList = Collections.synchronizedList(new ArrayList<CurrencyBox>());
public static List<CurrencyBox> getOrderList() {
return orderList
}
答案 1 :(得分:2)
同步列表仅同步此列表的方法。
这意味着一个线程无法修改列表,而另一个线程当前正在运行此列表中的方法。处理方法时对象被锁定。
例如,假设您的列表中有两个帖子addAll
,其中有2个不同的列表(A=A1,A2,A3
,B=B1,B2,B3
)作为参数。
随着方法的同步,您可以确保这些列表不会像A1,B1,A2,A3,B2,B3
一样随机合并
您不能决定线程何时将流程移交给其他线程,以便您可以获得A1,A2,A3,B1,B2,B3
或B1,B2,B3,A1,A2,A3
。
信用:jhamon