我正在尝试弄清楚Java 集合框架上的同步。但仍然没有任何明确的解决方案。
我的意思是,如果我们得到
并在列表中
什么是同步?
如果我们得到HashMap和HashTable,我们知道Hashtable在表上是同步的,而对HashMap的访问则不是。
答案 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同步,所以这是同步的