小编典典

同步块未锁定对象引用

java

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的内部演示

由于Thread.sleep(1000000),执行尚未结束。

我已经通过类的同一个实例Demo来的两个类的构造函数MyThread1MyThread2

Demo d = new Demo();
MyThread1 mt1 = new MyThread1("Thread 1", d);
MyThread2 mt2 = new MyThread2("Thread 2", d);

d.demoin 的调用MyThread1位于一个synchronized块中。
要在通话d.demoMyThread2没有synchronized块。

所以,当MyThread1被执行时,由于synchronized块,的监视器d应锁定,导致拒绝访问,以d.demo()由所述MyThread2

但是,这没有发生。

预期的输出是

Thread 1 starting
Inside demo of Thread1
Thread 2 starting

(输出在Thread.sleep(1000000)完成之前。)

因此,我的基本问题是: 即使 尚未完成 块,
如何MyThread2.d.demo()成功执行?MyThread1.d.demo()``synchronized


阅读 182

收藏
2020-11-26

共1个答案

小编典典

因此,在执行MyThread1时,由于存在synchronized阻塞,的监视器d应被锁定,从而导致d.demo()MyThread2
拒绝访问。

如果MyThread2也有一个synchronized块,那只会发生。当一个线程在对象上同步时,如果其他线程也尝试在同一对象上同步,则其他线程将被阻止。如果他们不同步,它们就不会同步。没有什么可以阻止从不同步对象的线程访问对象的。

同步是一种 协作 机制。仅当所有线程一起工作时,它才起作用。

2020-11-26