class Demo { void demo() { System.out.println("Inside demo of "+Thread.currentThread().getName()); try { Thread.sleep(1000000); } catch(InterruptedException exc) { System.out.println(Thread.currentThread().getName()+" interrupted"); } } } class MyThread1 implements Runnable { Thread thread; Demo d; MyThread1(String name, Demo ob) { d = ob; thread = new Thread(this, name); thread.start(); } @Override public void run() { System.out.println(thread.getName()+" starting"); synchronized(d) { d.demo(); } System.out.println(thread.getName()+" ending"); } } class MyThread2 implements Runnable { Thread thread; Demo d; MyThread2(String name, Demo ob) { d = ob; thread = new Thread(this, name); thread.start(); } @Override public void run() { System.out.println(thread.getName()+" starting"); d.demo(); System.out.println(thread.getName()+" ending"); } } class TimePass { public static void main(String args[]) { Demo d = new Demo(); MyThread1 mt1 = new MyThread1("Thread 1", d); MyThread2 mt2 = new MyThread2("Thread 2", d); } }
输出是
线程1开始 线程1的内部演示 线程2开始 线程2的内部演示
线程1开始
线程1的内部演示
线程2开始
线程2的内部演示
由于Thread.sleep(1000000),执行尚未结束。
Thread.sleep(1000000)
我已经通过类的同一个实例Demo来的两个类的构造函数MyThread1和MyThread2。
Demo
MyThread1
MyThread2
Demo d = new Demo(); MyThread1 mt1 = new MyThread1("Thread 1", d); MyThread2 mt2 = new MyThread2("Thread 2", d);
对d.demoin 的调用MyThread1位于一个synchronized块中。 要在通话d.demo中MyThread2是 没有 的synchronized块。
d.demo
synchronized
所以,当MyThread1被执行时,由于synchronized块,的监视器d应锁定,导致拒绝访问,以d.demo()由所述MyThread2。
d
d.demo()
但是,这没有发生。
预期的输出是
Thread 1 starting Inside demo of Thread1 Thread 2 starting
(输出在Thread.sleep(1000000)完成之前。)
因此,我的基本问题是: 即使 尚未完成 块, 如何MyThread2.d.demo()成功执行?MyThread1.d.demo()``synchronized
MyThread2.d.demo()
MyThread1.d.demo()``synchronized
因此,在执行MyThread1时,由于存在synchronized阻塞,的监视器d应被锁定,从而导致d.demo()MyThread2 拒绝访问。
如果MyThread2也有一个synchronized块,那只会发生。当一个线程在对象上同步时,如果其他线程也尝试在同一对象上同步,则其他线程将被阻止。如果他们不同步,它们就不会同步。没有什么可以阻止从不同步对象的线程访问对象的。
同步是一种 协作 机制。仅当所有线程一起工作时,它才起作用。