【问题标题】:Method synchronization working differently with different object initializations不同对象初始化的方法同步工作方式不同
【发布时间】:2018-12-06 15:16:37
【问题描述】:

根据我的代码,我有三个类:

显示:

class Display
{
    synchronized public void wish(String name)
    {
        for(int i = 0; i < 3; i++)
        {
            System.out.print("Good Morning: ");
            try
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException ie)
            {
            }
            System.out.println(name);
        }
    }
}

我的线程:

class MyThread extends Thread
{
    String name;
    Display d;


    MyThread(Display d, String name)
    {
        this.name = name;
        this.d = d;
    }

    @Override
    public void run()
    {
        d.wish(name); 
    }
}

演示:

class SynchronizedDemo 
{
    public static void main(String[] args) 
    {
        Display d = new Display();
        MyThread mt1 = new MyThread(d, "foo");
        MyThread mt2 = new MyThread(d, "bar");

        mt1.start();
        mt2.start();
    }
}

当我运行 Demo 类并得到以下输出时,它工作正常:

Good Morning: bar
Good Morning: bar
Good Morning: bar
Good Morning: foo
Good Morning: foo
Good Morning: foo

Output completed (6 sec consumed) - Normal Termination

这里我完全理解sleep()方法不会释放对象锁的事实,所以一旦一个线程进入wish()方法,它就完成了它的工作,那么只有另一个线程才有机会。

但如果我将 MyThread 类更改如下:

class MyThread extends Thread
{
    String name;
    Display d;


    MyThread(Display d, String name)
    {
        this.name = name;
        this.d = d;
    }

    Display d1 = new Display();

    @Override
    public void run()
    {
        d1.wish(name); 
    }
}

现在,唯一的变化是我使用了我在 MyThread 类中初始化的 Display 类对象。但出局完全出乎我的意料:

Good Morning: Good Morning: foo
Good Morning: bar
Good Morning: bar
Good Morning: foo
Good Morning: bar
foo

Output completed (3 sec consumed) - Normal Termination

这里的输出可以清楚地理解,只要一个线程进入睡眠状态,另一个线程就有机会执行wish()。

【问题讨论】:

标签: java multithreading synchronization


【解决方案1】:

在第二个示例中,d1 是内联初始化的 MyThread 类的成员(这只是在构造函数中对其进行初始化的语法糖)。 MyThread 的每个实例都有自己的 Display 实例,因此同步毫无意义——它们是两个不同的对象,在两个不同的监视器上同步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多