我在java中使用synchronized关键字时遇到了一些麻烦。我确实理解线程在方法或代码块上获取锁定的部分,但我不知道如何在以下示例中使用它。
我有2个不同的线程(线程A和Thead B)和一个Class1,它包含一个包含Class2实例的列表。由threadA调用的Class1.methodA()修改列表中的信息。由threadB调用的Class1.methodB()仅使用列表中的信息。
我得出结论,当线程A正在修改列表中的数据而线程B正在使用它时,我的程序中出现了问题。
我应该在Class1中创建一个同步方法,而不是调用MethodA或MethodB(对我来说似乎是多余的)。或者线程是否可以在正在修改的Class2的特定实例上获得锁定?
我很抱歉任何不好的英语。
答案 0 :(得分:0)
在列表中同步两个方法:
methodA()
{
synchronized(list)
{
... use the list, no one else can touch it
}
... do other stuff.
}
对于methodB()
也是如此答案 1 :(得分:0)
有关线程here
的解释好吧,回到你的问题。实际上,您只需在列表中使用同步,然后执行读取或添加此同步块。
synchronized(yourList)
{
// do something
}
否则我猜您可以使用CopyOnWriteArrayList
包中的java.util.concurrent
(API)。但这确实很昂贵,因为它始终是底层数组的新副本。
CopyOnWriteArrayList<String> myArrayList = new CopyOnWriteArrayList<String>();
myArrayList .add("Stackoverflow");
Iterator<String> iterator = myArrayList .iterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
另一种方法是使用synchronizedList
List list = Collections.synchronizedList(new ArrayList());
synchronized(list) {
Iterator i = list.iterator();
while (i.hasNext())
foo(i.next());
}
但是你最后还是需要同步块。添加和删除方法本身是原子和线程安全的,但迭代列表不是。