synchronized ArrayList vs synchronized method block



我有两个代码片段,这将做同样的事情,使线程安全。第一个是使用集合。synchronizedList,例子:

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

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

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

与以上两个例子的性能相比,什么是最有效和最安全的方法?

第一个实际上只是第二个的语法糖(它返回一个包装器列表,将synchronized (mutex)放在每个调用周围),因此从性能的角度来看,它不太可能产生任何差异。

至于"哪种方式最安全"——这取决于你的编码标准。如果你使用Collections.synchronizedList,你必须注意它的文件,特别是:

对备份列表的所有访问都必须通过返回列表完成。

当迭代时,用户必须在返回的列表上手动同步

在迭代控制同步的列表时,您仍然会遇到相同的问题-这只是说synchronizedList使用的互斥锁是列表本身。如果你控制同步,你只需要始终使用相同的互斥锁对所有线程安全访问备份列表。

您的问题可能暗示您不打算在上同步所有列表操作,而不仅仅是那些更改列表的操作。如果是这样,那么这将是错误的想法。但是,即使不是这样,使用synchronizedList包装器也可以消除程序的这种担忧,因为它保证了所有方法调用都是同步的。

synchronizedList不能保证的一件事是在使用列表迭代器的代码块上同步。这仍然是你需要在自己的同步块中做的事情。

最新更新