【问题标题】:What's synchronizes in Java Collection?Java Collection 中的同步是什么?
【发布时间】:2014-06-30 11:06:16
【问题描述】:

我正在尝试找出 Java collection 框架上的同步。但是还没有明确的解决办法。

我的意思是,如果我们得到 ​​p>

  • 列表
  • 安静
  • 设置

而且在名单上

  • 数组列表
  • 链表
  • 矢量

什么是同步的?

如果我们得到 HashMap 和 HashTable,我们知道 Hashtable 在表上是同步的,而对 HashMap 的访问则不是。

【问题讨论】:

标签: java collections synchronized


【解决方案1】:

看看以下实用方法:

  • Collections.synchronizedCollection()
  • Collections.synchronizedList()
  • Collections.synchronizedSet()
  • Collections.synchronizedMap()

【讨论】:

    【解决方案2】:

    没有一个集合的实现是同步的,因为同步不是类属性,它只适用于方法和块。

    【讨论】:

      【解决方案3】:

      jdk 集合 api 中的每个类都记录了它是否是线程安全的。像 java.util.Vector 这样的旧类倾向于在每个方法上同步,直到它们被非同步版本取代。在这种情况下是 ArrayList。然后添加了并发包,其中的所有内容都有一种或另一种线程安全策略。但是,一般来说,如果类文档没有说该类是线程安全的,则将其视为不是线程安全的。

      【讨论】:

        【解决方案4】:

        当你写作时

        private Object syncObject = new Object();
        
        public void someFunction(Stuff stuff)
        {
             synchronized(syncObject)
             {
                 list.add(stuff);
             }
        }
        
        public void someOtherFunction()
        {
             synchronized(syncObject)
             {
                 for(Stuff stuff : list)
                 {
                     stuff.doStuff();
                 }
             }
        }
        

        那么这意味着syncObject对象的Monitor不允许它里面有多个线程,它只允许一个Thread进入那个对象的monitor。这叫互斥,http://en.wikipedia.org/wiki/Mutual_exclusion

        这基本上是为了如果您有多个线程,那么您可以一次只执行一个线程来执行特定的代码块。例如,当您遍历一个数组时,您正在向另一个数组中添加项目,而您正在第三个中删除。您不希望它们相互混淆,因为这会产生不一致的结果。

        功能

        Collections.synchronizedCollection(Collection<T> c)
        

        例如,围绕 Collection 创建一个装饰器以使其方法同步。

        【讨论】:

        • 我想我误解了这个问题,对不起:P
        【解决方案5】:

        “同步”表示该类的方法是同步的。所有遗留类(例如 Vector、Hashtable、Stack)都被认为是同步的。更具体地说,这些遗留类的个人方法是同步的。 但是现在以 Vector 类为例,Vector 实现了 Collection 接口,因此它包含了 Collection 接口的一些实用方法(例如 add()、remove() 等),这些方法是不同步的。

        【讨论】:

          【解决方案6】:

          所有遗留类都是同步类,这意味着线程安全类。 Vector和Stack是同步类,Enumeration用于访问同步类中的值。

          【讨论】:

            【解决方案7】:

            传统类如 Vector、Stack、HashMap 是同步的。您还可以检查特定类的所有方法是否同步

            javap java.util.HashMap

            哪个不是同步类

            javap java.util.Hashtable

            所有方法都是同步的Hashtable同步

            【讨论】:

              猜你喜欢
              • 2012-03-13
              • 1970-01-01
              • 1970-01-01
              • 2011-12-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-03-01
              相关资源
              最近更新 更多