有人可以告诉我,在“myClass”中执行 run 命令的 Java 线程(在下面的代码中)是否在 CustomList 的 get() 命令获取对象的时间和 myClass 的 run 请求的时间之间失去对象的同步同一对象的同步?
如果初始线程保持同步,则由 CustomList 的 get 命令创建的“myThread”的中心代码应该永远无法触发,直到原始线程完成请求的对象。
public class myClass implements Runnable {
private CustomList list;
public myClass(){
list = new CustomList();
//Code to pack "list" goes here.
}
public void run(){
int position = 0;
while(position<list.size()){
synchronized(list.get(position)){
//Opperation's central code.
}
position++;
}
}
public class CustomList extends ArrayList<Object> {
public CustomList(){
super();
}
public Object get(int i){
Object o = super.get(i);
synchronized(o){
myThread thread = new myThread(o);
thread.start();
return o;
}
}
}
public class myThread extends Thread {
private Object subject;
public myThread(Object o){
subject = o;
}
public void run(){
synchronized(subject){
//Do something to "subject"
//BUT only AFTER the original Thread is finished with it.
}
}
}
}
最佳答案
答案是肯定的。鉴于您提供的代码,您的 CustomList 不是线程安全的。
要解决此问题,请停止尝试自定义同步。你对它的理解还不够深入。相反,使用 java.util.Collections.synchronizedList() 来包装 java.util.ArrayList 的实例。
private List<Object> list = Collections.synchronizedList(new ArrayList<Object>());
关于java - 通过代码链同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28018313/