【问题标题】:What is the difference between using synchronizedCollection and just synchronized (collection)?使用 synchronizedCollection 和刚刚同步 (collection) 有什么区别?
【发布时间】:2016-05-21 03:18:33
【问题描述】:

1.6 Javadoc 对此并不清楚。有什么区别

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

对比

List l = LinkedList();
Collection c = Collections.synchronizedCollection (l);
synchronized (c) {
    c.add...; c.set....; c.remove...
}

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

【问题讨论】:

    标签: java collections synchronization


    【解决方案1】:

    第一种方法有什么问题?

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

    为什么需要 synchronizedCollection 类?

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

    首先使用synchronizedCollection 的原因是为了避免synchronized 块。在不同步的情况下调用 addsetremove 不会使您的集合处于无效状态。

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

    【讨论】:

    • 但是根据javadoc:如果多个线程同时访问一个链表,并且至少有一个线程在结构上修改了链表,则必须对外同步。 ....这通常是通过同步一些自然地说明列表的对象来完成的。如果不存在这样的对象,则应使用 Collections.synchronizedList 方法“包装”该列表。所以这是我不明白的,为什么javadoc说同步通常是在封装对象上完成的,而不是链表对象本身?
    • @FaiLau synchronizedCollection 返回的对象不是链表。它里面有链表,但它是一个特殊的类,在调用实际链表之前添加了自己的同步。
    • 好的,我现在明白了。 SyncrhonizedCollection 向包含类返回一个线程安全的外观。但是返回的对象是线程安全的,不是并发的。所以当使用迭代器时,对象仍然需要同步。
    • @FaiLau 是的,您需要在迭代或必须以原子方式执行多个操作时手动同步(例如,以外部观察者在操作中间,当一项已被删除,但另一项尚未插入时)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2023-03-30
    • 2012-10-22
    • 2011-01-09
    相关资源
    最近更新 更多