正确使用Collections.synchronizedList

时间:2017-08-08 11:59:40

标签: java

我不确定如何正确使用Collections.synchronizedList()实现。

我有这两个:

   public synchronized static List<CurrencyBox> getOrderList() {
        return Collections.synchronizedList(orderList);
    }

 public static List<CurrencyBox> getOrderList() {
        return Collections.synchronizedList(orderList);
    }

据我所知,synchronizedList确实返回orderList而不是副本,对吗?

所以如果我想保证原子操作,比如添加和删除,上面的哪个实现是正确的?

使用Java9可能会有什么变化吗?或者它仍然是要走的路还是你有任何其他建议吗?

谢谢

2 个答案:

答案 0 :(得分:2)

没有上下文,有点难以分辨,从提供的片段中都没有给你保证原子操作。

文档说明:

  

返回由指定的支持的同步(线程安全)列表   名单。为了保证串行访问,所有这一切至关重要   访问后备列表是通过返回的列表完成的。

因此,即使您同步该方法,您将获得的最佳结果是保证没有两个对象同时创建同步列表。

您需要将原始的orderListCollections.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,A3B=B1,B2,B3)作为参数。

  • 随着方法的同步,您可以确保这些列表不会像A1,B1,A2,A3,B2,B3一样随机合并

  • 您不能决定线程何时将流程移交给其他线程,以便您可以获得A1,A2,A3,B1,B2,B3B1,B2,B3,A1,A2,A3

信用:jhamon