【发布时间】: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()。
【问题讨论】:
-
同步发生在实例上。当你同步一个(非静态)方法时,相当于把body包裹在
synchronized (this) {}中。
标签: java multithreading synchronization