我在接受采访时询问,对于多线程,假设你在同一个对象上有2个线程(Thread-1和Thread-2)。 Thread-1在synchronized1()中,Thread-2可以在java中同时进入synchronized method2()。
我回答否否,这里当Thread-1在同步方法1()中时,它必须在对象的监视器上保持锁定,并且只有当它退出同步的method1()时才会释放对象监视器上的锁定。因此,Thread-2必须等待Thread-1释放对象监视器上的锁定,以便它可以进入同步的method2()。
但还是请指教是否有任何方式通过哪个Thread-2,在java中同时进入synchronized method2()以任何方式是否有任何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());
}
}
答案 0 :(得分:1)
请注意,在您的示例中,即使MyRunnable1类有一个method1()并且您的run()函数在循环中调用此方法,线程也不会在任何事情上竞争。因为thread1和thread2是不同的实例,并且每个实例都拥有它自己的method1()副本,所以synchronized使用的锁是不同的,而不是一个锁。
答案 1 :(得分:0)
两个线程无法同时保持相同的锁定。但是,仅仅因为一个线程在一个对象的<html>
<head>
<script type="text/javascript">
function over()
{
document.getElementById("b1").innerHTML="You have hovered mouse over me";
}
</script>
</head>
<body>
<button onmouseover="over()" id="b1">Hover mouse over me</button>
</body>
方法内,它不会跟随它持有锁。例如,它可以在条件变量上调用synchronized
并在等待时释放锁定。这允许其他线程通过输入await
方法获取锁定 - 毕竟,这就是你正在等待的。
答案 2 :(得分:0)
您的代码如下:
let cell = userTable.dequeueReusableCell(withIdentifier: "users", for: indexPath)
for v in cell.subviews {
v.removeFromSuperview()
}
并且在您的代码中,两个线程无法同时为锁争用输入两个方法。您只能在不同的runnable实例上执行此操作,即不同。