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

时间:2016-12-18 05:33:24

标签: java multithreading

我在接受采访时询问,对于多线程,假设你在同一个对象上有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());
    }
}

3 个答案:

答案 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实例上执行此操作,即不同。