Java 使用synchronizedCollection和刚刚同步(collection)有什么区别?

Java 使用synchronizedCollection和刚刚同步(collection)有什么区别?,java,collections,synchronization,Java,Collections,Synchronization,1.6 Javadoc对此不清楚。两者的区别是什么 List l = LinkedList(); synchronized (l) { l.add... // do some work l.set... l.remove... } vs ??? 为什么需要synchronizedCollection类?第一种方法有什么问题 第一种方法有什么问题 它没有什么问题:只要同步所有访问,您的程序就会按预期运行 为什么需要synchronizedCollection类 如果要在s

1.6 Javadoc对此不清楚。两者的区别是什么

List l = LinkedList();
synchronized (l) {
    l.add... // do some work
    l.set...
    l.remove...
}
vs

??? 为什么需要synchronizedCollection类?第一种方法有什么问题

第一种方法有什么问题

它没有什么问题:只要同步所有访问,您的程序就会按预期运行

为什么需要synchronizedCollection类

如果要在
synchronized
块中使用它,实际上没有理由:集合中的额外同步不会锁定其他读卡器和写入器,因为
synchronized
块已经这样做了

首先使用
synchronizedCollection
的原因是为了避免
synchronized
块。在不同步的情况下调用
add
set
remove
不会使收藏处于无效状态

但是,如果语句外没有
synchronized
块,则三个单独的操作将不会作为原子块执行

第一种方法有什么问题

它没有什么问题:只要同步所有访问,您的程序就会按预期运行

为什么需要synchronizedCollection类

如果要在
synchronized
块中使用它,实际上没有理由:集合中的额外同步不会锁定其他读卡器和写入器,因为
synchronized
块已经这样做了

首先使用
synchronizedCollection
的原因是为了避免
synchronized
块。在不同步的情况下调用
add
set
remove
不会使收藏处于无效状态


但是,如果语句外没有
synchronized
块,这三个单独的操作将不会作为一个原子块执行。

但是根据javadoc:如果多个线程同时访问一个链表,并且至少有一个线程在结构上修改链表,则必须在外部进行同步。。。。这通常是通过在自然脱离列表的某个对象上进行同步来实现的。如果不存在此类对象,则应使用Collections.synchronizedList方法“包装”列表。我不明白的是,为什么javadoc说同步通常是在封装对象上进行的,而不是在链表对象本身上?@FaiLau
synchronizedCollection
返回的对象不是链表。它里面有链表,但它是一个特殊的类,在调用实际的链表之前添加了自己的同步。SyncrhonizedCollection将线程安全的外观返回给包含的类。但是返回的对象是线程安全的,不是并发的。因此,当使用迭代器时,对象仍然需要同步。@FaiLau是的,当您进行迭代器或必须以原子方式执行多个操作时,您需要手动同步(例如,删除一个项并插入另一个项,这样外部观察员就不会在操作的中间看到您的集合,当一个项已经被删除,而另一个项尚未被插入时).但根据javadoc:如果多个线程同时访问一个链表,并且至少有一个线程在结构上修改了链表,则必须在外部对其进行同步…..这通常是通过在自然脱离链表的某个对象上进行同步来实现的。如果不存在这样的对象,则应“包装”链表使用Collections.synchronizedList方法。我不明白的是,为什么javadoc说同步通常在封装对象上进行,而不是在链表对象本身上?@FaiLau
synchronizedCollection
返回的对象不是链表。它里面有链表,但它是一个特殊的class在调用实际列表之前添加自己的同步。好的,我现在就知道了。SyncrhonizedCollection将线程安全的外观返回给包含的类。但是返回的对象是线程安全的,而不是并发的。因此,当使用迭代器时,该对象仍然需要同步。@FaiLau是的,您需要在创建时手动同步速率或当您必须原子执行几个操作(例如,删除一个项目,并插入另一个项目的方式,外部观察员永远看不到您的集合在操作中,当一个项目已经删除,但另一个还没有被插入)。
List l = LinkedList();
Collection c = Collections.synchronizedCollection (l);
synchronized (c) {
    c.add...; c.set....; c.remove...
}