【问题标题】:Java multi threading synchronisation not working for this for loopJava 多线程同步不适用于此 for 循环
【发布时间】:2018-07-28 16:30:09
【问题描述】:

我正在尝试在 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);
        }
    }
}

这是输出:

its execting      2nd
its execting      3rd
its execting      1st
3rd    0
3rd    1
3rd    2
3rd    3
3rd    4
3rd    5
3rd    6
3rd    7
2nd    0
3rd    8
1st    0
1st    1
1st    2
1st    3
1st    4
3rd    9
2nd    1
2nd    2
2nd    3
2nd    4
2nd    5
1st    5
2nd    6
1st    6
2nd    7
1st    7
2nd    8
1st    8
2nd    9
1st    9

【问题讨论】:

  • synchronized 锁定当前对象的监视器。您有不同的实例,因此 synchronized 什么都不做。
  • 请参阅链接中的示例,了解如何使用外部线程对象。 producer_consumer

标签: for-loop concurrency synchronization


【解决方案1】:

您在方法上使用了synchronised 关键字。这意味着您正在对当前对象实例进行同步。由于您有三个不同的“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);
            }
        }
    }
}

【讨论】:

  • 谢谢亚历山大,我明白你想要表达的意思。我使用了你的代码,但我没有得到预期的 o/p。你能帮帮我吗?
  • 你得到了哪个输出?
  • 与我的问题中显示的相同...我期待一个 o/p 如下:从 1 到 10 的线程一 o/p,然后是线程二,然后是线程三输出。而不是我的问题所示的混淆。
  • 由于线程同时启动,您无法确定哪个线程首先执行。为了固定顺序(1、2、3),您还必须同步创建。但是你有一个异步程序,线程根本没有意义。
  • 感谢您的意见...完全理解您的观点...看来我应该更多地锻炼以更快地理解这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
  • 2012-03-28
  • 2014-01-29
  • 2011-02-13
  • 2021-06-29
  • 2014-12-27
  • 1970-01-01
相关资源
最近更新 更多