Java 通过代码链进行同步

Java 通过代码链进行同步,java,synchronization,Java,Synchronization,有人能告诉我,在CustomList的get()命令获取对象和myClass的run请求同步同一对象之间,在“myClass”(以下代码中)中执行run命令的Java线程是否会丢失对象的同步 如果初始线程保持同步,那么由CustomList的get命令创建的“myThread”的中心代码在原始线程处理完请求的对象之前将永远无法触发 public class myClass implements Runnable { private CustomList list; publi

有人能告诉我,在CustomList的get()命令获取对象和myClass的run请求同步同一对象之间,在“myClass”(以下代码中)中执行run命令的Java线程是否会丢失对象的同步

如果初始线程保持同步,那么由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.
            }
        }

    }

}
公共类myClass实现可运行{
私人客户名单;
公共myClass(){
list=新的CustomList();
//这里是打包“列表”的代码。
}
公开募捐{
int位置=0;

while(position答案是肯定的。鉴于您提供的代码,您的CustomList不是线程安全的

要解决此问题,请停止尝试自定义同步。您还不太了解它。相反,请使用
java.util.Collections.synchronizedList()
包装
java.util.ArrayList
的实例

private List<Object> list = Collections.synchronizedList(new ArrayList<Object>());
private List=Collections.synchronizedList(new ArrayList());

答案是肯定的。鉴于您提供的代码,您的CustomList不是线程安全的

要解决此问题,请停止尝试自定义同步。您还不太了解它。相反,请使用
java.util.Collections.synchronizedList()
包装
java.util.ArrayList
的实例

private List<Object> list = Collections.synchronizedList(new ArrayList<Object>());
private List=Collections.synchronizedList(new ArrayList());

答案是肯定的。鉴于您提供的代码,您的CustomList不是线程安全的

要解决此问题,请停止尝试自定义同步。您还不太了解它。相反,请使用
java.util.Collections.synchronizedList()
包装
java.util.ArrayList
的实例

private List<Object> list = Collections.synchronizedList(new ArrayList<Object>());
private List=Collections.synchronizedList(new ArrayList());

答案是肯定的。鉴于您提供的代码,您的CustomList不是线程安全的

要解决此问题,请停止尝试自定义同步。您还不太了解它。相反,请使用
java.util.Collections.synchronizedList()
包装
java.util.ArrayList
的实例

private List<Object> list = Collections.synchronizedList(new ArrayList<Object>());
private List=Collections.synchronizedList(new ArrayList());



downvote,因为即使使用synchronizedList,这里也可能存在竞争条件,因为我们不知道询问者试图做什么。aa现在我无法取消downvote,因为询问者澄清他们只是问这个特定的问题,而不是关于修复他们的代码。干得好,StackOverflow。很抱歉。@immibis,我做了对我的答案做一个小改动,这样你就可以删除你的否决票:)完成。[15个字符]被否决,因为即使使用synchronizedList,这里也可能存在竞争条件,因为我们不知道询问者试图做什么。aa现在我无法取消被否决,因为询问者澄清他们只是问这个特定的问题,而不是修复他们的代码。干得好,StackOverflow。很抱歉。@immibis我做了一个triv对我的答案进行修改,以便删除否决票:)完成。[15个字符]被否决,因为即使使用synchronizedList,这里也可能存在竞争条件,因为我们不知道询问者试图做什么。aa现在我无法取消被否决,因为询问者澄清他们只是问这个特定的问题,而不是修复他们的代码。干得好,StackOverflow。很抱歉。@immibis我做了一个triv对我的答案进行修改,以便删除否决票:)完成。[15个字符]被否决,因为即使使用synchronizedList,这里也可能存在竞争条件,因为我们不知道询问者试图做什么。aa现在我无法取消被否决,因为询问者澄清他们只是问这个特定的问题,而不是修复他们的代码。干得好,StackOverflow。很抱歉。@immibis我做了一个triv我对我的答案做了一些修改,这样你就可以删除你的否决票:)完成。[15个字符]你的最终目标是什么?另外,你目前对
同步的
了解多少?基本上,我的最终目标是拥有一个分配对象(很像列表或地图)的对象,该对象专门设计用于同步的(对象)我希望分发器设备向第二个线程注册对某个对象的每个此类请求,以便第二个线程将尝试与同一个对象同步,然后对其执行操作,但仅当请求该对象的初始线程完成该操作时。(即,已放弃与对象的同步)。我的意图是将对象提供给CustomList的get函数的synchronized括号内的第二个线程,就在返回行之前。或者,至少,在我自己的代码中的一个类似位置。但是,如果在我上面的示例中,同步不起作用,正如gkincker所指出的那样,那么我似乎必须找到其他方法来适应这就是为什么我完全不知道你想做什么。原谅我,我只是问一个简单的问题,同步是否通过了正如我所希望的那样,我没有试图深入了解我的最终目标是什么。我编辑了我的问题,添加了新的代码行,试图更详细地说明我试图做什么。你的最终目标是什么?还有,你目前对
synchronized
了解多少?基本上我的最终目标是拥有一个at分配专门设计用于同步(对象)命令的对象(与列表或映射非常类似)