gpt4 book ai didi

java - 同步块(synchronized block)未锁定对象引用

转载 作者:行者123 更新时间:2023-11-29 09:43:26 25 4
gpt4 key购买 nike

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);
}
}

输出是

Thread 1 starting

Inside demo of Thread 1

Thread 2 starting

Inside demo of Thread 2

由于Thread.sleep(1000000),执行还没有结束。

我已将类 Demo 的相同实例传递给类 MyThread1MyThread2 的构造函数。

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

MyThread1 中对d.demo 的调用在同步 block 中。
MyThread2 中对 d.demo 的调用同步 block 中。

所以,当MyThread1执行时,由于synchronized block ,d的monitor应该被锁住,导致拒绝访问通过 MyThread2d.demo()

但这并没有发生。

预期的输出是

Thread 1 starting
Inside demo of Thread1
Thread 2 starting

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

所以,我的基本问题是:即使 MyThread1.d.demo() 尚未执行,MyThread2.d.demo() 如何执行成功完成了 synchronized block ?

最佳答案

So, when MyThread1 is executing, due to the synchronized block, the monitor of d should be locked, resulting in denial of access to d.demo() by the MyThread2.

只有当 MyThread2 也有一个 synchronized block 时才会发生这种情况。当一个线程在一个对象上同步时,如果其他线程也尝试在同一对象上同步,它们将被阻塞。如果他们不同步,他们就不会。没有什么可以阻止未同步的线程访问对象。

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

关于java - 同步块(synchronized block)未锁定对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31059728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com