0

同步

我已经声明了一个class b具有同步方法的方法,该方法可以在以下位置访问class c

class b {
    String msg;

    public synchronized void foo() {
        System.out.print("[" + msg);
        try {
            Thread.sleep(1000); // Threads go to sleeep

        } catch (InterruptedException e) {
            System.out.println("Caught" + e);
        }
        System.out.println("]");
    }
}

class a implements Runnable {
    b ob;

    Thread t;

    a(String msg, b obb) {
        ob = obb;
        ob.msg = msg;
        t = new Thread(this); // creating a thread
        t.start();
    }

    public void run() {
        ob.foo(); // calling method of class b
    }

    public static void main(String... a) {
        b obb = new b();
        a ob = new a("Hello", obb); /* PASSING */
        a ob1 = new a("Synch", obb); /* THE */
        a ob2 = new a("World", obb);/* MESSAGE */

        try {
            ob.t.join();
            ob1.t.join();
            ob2.t.join();
        } catch (InterruptedException e) {
            System.out.println("Caught" + e);
        }
    }
}

我期待输出:

[Hello]
[Synch]
[World]

但是代码给出了:

[World]
[World]
[World]

帮我提些建议。我是一个天真的 JAVA 用户。

4

3 回答 3

1

使用以下代码获得预期的答案。

class b { // 字符串消息;

public void foo(String msg) {
    System.out.print("[" + msg);
    try {
        Thread.sleep(1000); // Threads go to sleeep

    } catch (InterruptedException e) {
        System.out.println("Caught" + e);
    }
    System.out.println("]");
}

}

公共类线程实现可运行{

    b ob;
String msg;
Thread t;

Threading(String message, b obb) {
    ob = obb;
    msg = message;
    t = new Thread(this); // creating a thread
    t.start();
}

public void run() {
    synchronized (ob) {
        ob.foo(msg); // calling method of class b
    }

}

public static void main(String... a) {
    b obb = new b();
    Threading ob = new Threading("Hello", obb); /* PASSING */
    Threading ob2 = new Threading("World", obb); /* THE */
    Threading ob1 = new Threading("Synch", obb);/* MESSAGE */

    try {
        ob.t.join();
        ob1.t.join();
        ob2.t.join();
    } catch (InterruptedException e) {
        System.out.println("Caught" + e);
    }
}

}

于 2013-10-11T09:23:17.240 回答
0

首先重新格式化你的代码。很难阅读。其次,当您调用ob.msg = msg;它时,它会覆盖 ob 中的 msg 值,并且由于它不同步,因此您实际上无法预测输出将是什么。

于 2013-10-11T09:10:40.187 回答
0

在您设置的代码中ob.msg=msg; msg被线程覆盖。因此,您对所有线程都有相同的消息。

在类的每个线程的构造函数中,a您传递的是类的相同对象b。现在所有三个线程都在设置msgclass 实例的值b。所以一个值会覆盖另一个值。你所拥有的是最后一个线程设置的值,即World

fooIMO:将 msg 保存为每个线程中的实例变量,并将其作为参数传递给方法。

请遵循 Java 命名约定,即 Camel Casing

于 2013-10-11T09:01:41.797 回答