我有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] 删除。
我来说两句