所以我知道同步关键字的工作原理如何,但是我认为它可以正常工作(即两个线程在添加或删除时不会踩到彼此的脚趾)
public MyClass myClass = new MyClass();
public MyClass2 myClass2 = new MyClass2();
public class MyClass {
private ArrayList<String> myString = new ArrayList<String>();
public ArrayList<String> GetArrayList() {
return myString;
}
public MyClass() {
new Thread(new Runnable {
public void run() {
synchronized(myString) {
/* add or remove myString elements */
}
}
}).start();
}
}
public class MyClass2 {
// Pointer to myString
ArrayList<String> refString;
public MyClass2() {
refString = myClass.GetArrayList();
new Thread(new Runnable {
public void run() {
synchronized(refString) {
/* add or remove refString elements */
}
}
}).start();
}
}
}
编辑:下次我将在eclipse中输入此内容并复制和粘贴:)
答案 0 :(得分:2)
它会工作,但为什么不使用Collections.synchronizedList(new ArrayList)?
如果你正在做的只是ADD或REMOVE,而不是check-then-act(例如if!myList.contains {myList.add})那就是你所需要的,并且你避免使用synchronized块使你的代码变得丑陋< / p>
答案 1 :(得分:1)
是的,它会起作用。您正在处理对同一对象的引用,因此将使用synchronized
语句锁定和测试相同的对象。
答案 2 :(得分:0)
首先,同步块可以处理对象,所以如果你使用一个对象来同步你的关键部分,它就可以工作了。但你在myClass2构造函数中做了什么。你在myClass2构造函数中定义了myClass构造函数,它不是一个有效的代码。