Java Collection中的同步是什么?

时间:2014-06-30 11:06:17

标签: java collections synchronized

我正在尝试弄清楚Java 集合框架上的同步。但仍然没有任何明确的解决方案。

我的意思是,如果我们得到

  • list
  • Queie

并在列表中

  • 的ArrayList
  • 链表
  • 矢量

什么是同步?

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

7 个答案:

答案 0 :(得分:3)

查看以下实用程序方法:

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

写作时

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进入该对象的监视器。这称为互斥,http://en.wikipedia.org/wiki/Mutual_exclusion

这基本上是这样的,如果你有多个线程,那么你可以一次只执行一个特定的执行代码块。例如,当您通过一个数组迭代数组时,但是您要在另一个数组中向该数组添加项目,并且您将在第三个数组中删除。你不希望他们互相混淆,因为这会产生不一致的结果。

功能

Collections.synchronizedCollection(Collection<T> c)

在Collection周围创建一个Decorator,以使其方法同步,例如。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

  

javap java.util.HashMap

哪个不是同步类

  

javap java.util.Hashtable

由于所有方法都与Hashtable同步,所以这是同步的