gpt4 book ai didi

java - 两个线程在实例级锁上同时进入两个不同的同步方法

转载 作者:行者123 更新时间:2023-11-30 06:59:19 26 4
gpt4 key购买 nike

我在一次采访中被问到关于多线程,假设你在同一个对象上有 2 个线程(Thread-1 和 Thread-2)。 java中Thread-1处于synchronized method1()中,Thread-2可以通过任何方式同时进入synchronized method2()吗?

我回答说不不,这里当Thread-1处于synchronized method1()中时,它必须持有对象监视器上的锁,并且只有当它退出synchronized method1()时才会释放对象监视器上的锁。因此,Thread-2 必须等待 Thread-1 释放对象监视器上的锁,才能进入同步方法 2()。

但仍然请告知是否有任何方法可以让 Thread-2 在 java 中同时进入同步方法2() 如果要实现这个目标是否有任何 hack

下面是我的程序,现在我已经更改了实现,请就此提出建议,因为以下程序的输出是

inside M1()
t1--->RUNNABLE
inside M2()
t2--->RUNNABLE

下面是我更新的代码

public class Test {

private final Object lockA = new Object();
private final Object lockB = new Object();

public void m1() {
synchronized(lockA) {
try {
System.out.println("inside M1()");
Thread.sleep(100);
}
catch (InterruptedException ie)
{}
}
}

public void m2() {
synchronized(lockB) {
try {
System.out.println("inside M2()");
Thread.sleep(100); }
catch (InterruptedException ie) {}
}
}

public static void main(String[] args) throws InterruptedException {
final Test t = new Test();
Thread t1 = new Thread()
{ public void run() { t.m1(); } };
Thread t2 = new Thread()
{ public void run() { t.m2(); } };

t1.start();
//Thread.sleep(500);

t2.start();
// Thread.sleep(500);

System.out.println("t1--->"+t1.getState());
System.out.println("t2--->"+t2.getState());
}
}

最佳答案

请注意,在您的示例中,即使 MyRunnable1 类具有单个 method1() 并且您的 run() 函数在循环中调用此方法,线程也不会在任何事情上竞争。因为thread1和thread2是不同的实例,并且每个实例都有自己的method1()副本,所以synchronized使用的锁是不同的,而不是一个锁。

关于java - 两个线程在实例级锁上同时进入两个不同的同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41205793/

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