我可以同步2种不同的方法吗? java的

时间:2015-03-19 21:28:19

标签: java multithreading synchronization

我在java中使用synchronized关键字时遇到了一些麻烦。我确实理解线程在方法或代码块上获取锁定的部分,但我不知道如何在以下示例中使用它。

我有2个不同的线程(线程A和Thead B)和一个Class1,它包含一个包含Class2实例的列表。由threadA调用的Class1.methodA()修改列表中的信息。由threadB调用的Class1.methodB()仅使用列表中的信息。

我得出结论,当线程A正在修改列表中的数据而线程B正在使用它时,我的程序中出现了问题。

我应该在Class1中创建一个同步方法,而不是调用MethodA或MethodB(对我来说似乎是多余的)。或者线程是否可以在正在修改的Class2的特定实例上获得锁定?

我很抱歉任何不好的英语。

2 个答案:

答案 0 :(得分:0)

在列表中同步两个方法:

methodA()
{
   synchronized(list) 
   {
      ... use the list, no one else can touch it
   }
   ... do other stuff.
}

对于methodB()

也是如此

More info here

答案 1 :(得分:0)

有关线程here

的解释

好吧,回到你的问题。实际上,您只需在列表中使用同步,然后执行读取或添加此同步块。

synchronized(yourList)
{
    // do something
}

否则我猜您可以使用CopyOnWriteArrayList包中的java.util.concurrentAPI)。但这确实很昂贵,因为它始终是底层数组的新副本。

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());
}

但是你最后还是需要同步块。添加和删​​除方法本身是原子和线程安全的,但迭代列表不是。