Util创建在指定互斥锁上同步的列表

时间:2015-04-03 12:08:35

标签: java list concurrency synchronized

是否有一些util在指定的互斥锁上创建了一个同步列表?像java.util.Collections.synchronizedList(List<T> list, Object mutex)但是公开?

1 个答案:

答案 0 :(得分:0)

没有这样的 let manager = AFHTTPRequestOperationManager() manager.requestSerializer = AFJSONRequestSerializer() let params = ["longUrl": "MYURL"] manager.POST("https://www.googleapis.com/urlshortener/v1/url?key=MYKEY", parameters: params, success: {(operation: AFHTTPRequestOperation!,responseObject: AnyObject!) in println("JSON: " + responseObject.description) }, failure: { (operation: AFHTTPRequestOperation!,error: NSError!) in println("Error while requesting shortened: " + error.localizedDescription) }) 方法可以控制同步集合将使用的互斥锁。因此,如果不是允许您指定互斥锁的列表,则必须以这种灵活性实现更高级别的操作,例如:

public

然后可以用作

public static <T> boolean addIfNew(List<T> target, T value, Object mutex) {
    synchronized (mutex) {
        return !target.contains(value) && target.add(value);
    }
}

这是有效的,因为List<String> synchedList=Collections.synchronizedList(new ArrayList<String>()); addIfNew(synchedList, "foo", synchedList); 返回的列表将自己用作互斥锁。与its documentation比较:

强调我的

  

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

synchronizedList

实现允许在内部使用不同的互斥对象的原因是您可以创建sub lists并且同步列表的子列表将在后备列表实例上而不是自身上同步(同样适用于{{1} })。因此,当您将子列表传递给高级方法时,将原始同步列表作为互斥量传递至关重要。

类似的内容适用于 List list = Collections.synchronizedList(new ArrayList()); ... synchronized (list) { Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); } 地图视图:

Collections.synchronizedMap

  

当迭代任何集合视图时,用户必须手动同步返回的地图:

Vector.subList

这有一个简化。如果您确保在方法中对集合进行所有访问,则这些方法可能就任意互斥锁达成一致,并且如果在该互斥锁上一致地同步,则可以是线程安全的。当然,集合本身不需要自己进行额外的同步,但这就是它的全部内容:

在实践中,您很难找到这些同步集合的任何有用场景。任何非trival操作都需要多次访问集合,因此需要手动或更高级别的同步,这使得低级同步过时。

考虑将同步集合传递给使用集合的任意方法并自动获得线程安全而没有额外的同步,这很有吸引力但是因为只有当所述方法包含对集合的单一访问时才会起作用,所以你不会发现任何有用的现实生活方法。

因此,最重要的是,您必须始终使您的代码线程安全并控制对集合的访问,因此永远不需要同步集合。