同步ArrayList与同步方法块

tk_

我有2个代码片段,它们将执行使线程安全的相同操作。第一个使用Collections.synchronizedList来实现,例如:

DataServiceRequest request = Collections.synchronizedList(new ArrayList<DataServiceRequest>());

第二个通过同步方法做同样的事情,例如:

public synchronized void addRequest(DataServiceRequest request) {
   this.getRequests().add(request);
}

与上述两个示例的性能进行比较时,最有效,最安全的方法是什么?

安迪·布朗

第一个实际上只是第二个的语法糖(它返回一个包装列表,该包装列表放置synchronized (mutex)在每个调用周围),因此从性能的角度来看,这不太可能有所不同。

至于“这是最安全的方法”-这取决于您的编码标准。使用时必须注意文件Collections.synchronizedList,尤其是:

至关重要的是,对后备列表的所有访问都必须通过返回的列表来完成。

当用户遍历返回列表时,必须手动对其进行同步

迭代列表以控制同步时,仍然会遇到相同的问题-这只是说synchronizedList列表中使用的互斥体是列表本身。如果控制同步,则只需要对所有线程安全访问后备列表始终使用相同的互斥即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章