For loop Java多线程同步不适用于此for循环

For loop Java多线程同步不适用于此for循环,for-loop,concurrency,synchronization,For Loop,Concurrency,Synchronization,我试图在for循环上使用同步,从技术上讲,for循环应该在允许下一个线程执行之前完全由一个线程执行 我声明了3个线程,然后执行了它,但是我同时得到了3个线程的输出 请查找我的以下代码: public class Sample { public static void main(String[] args) { DummyForSample1 t1 = new DummyForSample1(); t1.setName("1st");

我试图在
for
循环上使用同步,从技术上讲,for循环应该在允许下一个线程执行之前完全由一个线程执行

我声明了3个线程,然后执行了它,但是我同时得到了3个线程的输出

请查找我的以下代码:

public class Sample {
    public static void main(String[] args) {        
       DummyForSample1 t1 = new DummyForSample1();
       t1.setName("1st");
       t1.start();
       DummyForSample1 t2 = new DummyForSample1();
       t2.setName("2nd");
       t2.start();      
       DummyForSample1 t3 = new DummyForSample1();
       t3.setName("3rd");
       t3.start();      
    }
}
public class DummyForSample1 extends Thread {

    public void run(){
        System.out.println("its execting      " +     
            Thread.currentThread().getName());
        forloop();  
    }
    synchronized void forloop() {
        for (int i=0;i<10;i++) {
            System.out.println(Thread.currentThread().getName()+ "    " + i);
        }
    }
}

您正在对方法使用
synchronized
关键字。这意味着您正在当前对象实例上进行同步。由于有三个不同的“DummyForSample1”实例,因此没有任何东西可以阻止线程同时进入相同的方法

确保所有线程都使用相同的对象进行锁定。在您的示例中,您可以使用静态成员来实现这一点,如下所示:

public class DummyForSample1 extends Thread {

    private static final Object lock = new Object();

    public void run() {
        System.out.println("its execting      " +
                Thread.currentThread().getName());
        forloop();
    }

    void forloop() {
        synchronized (lock) {
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName() + "    " + i);
            }
        }
    }
}
公共类DummyForSample1扩展了线程{
私有静态最终对象锁=新对象();
公开募捐{
System.out.println(“它的执行”+
Thread.currentThread().getName());
forloop();
}
void forloop(){
已同步(锁定){
对于(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+“”+i);
}
}
}
}

synchronized
锁定当前对象的监视器。您有不同的实例,因此
synchronized
什么都不做。请参阅链接中有关如何使用外部线程对象的示例。谢谢亚历山大,我明白你想表达的意思。我使用了你的代码,但我没有得到预期的o/p。你能帮我吗?你得到了什么输出?和我的问题中显示的一样。。。我希望o/p如下:线程1从1到10,然后是线程2,然后是线程3输出。正如我的问题所示,这不是一个混乱。因为线程是同时启动的,所以你无法确定哪个线程先被执行。为了固定顺序(1、2、3),您还必须同步创建。但是你有一个异步程序,线程毫无意义。。。完全理解你的观点。。。看来我应该多锻炼才能更快地理解这一点。
public class DummyForSample1 extends Thread {

    private static final Object lock = new Object();

    public void run() {
        System.out.println("its execting      " +
                Thread.currentThread().getName());
        forloop();
    }

    void forloop() {
        synchronized (lock) {
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName() + "    " + i);
            }
        }
    }
}