当前位置: 首页 > 知识库问答 >
问题:

在实例级锁中,两个线程同时进入两个不同的synchrnozied方法

张姚石
2023-03-14

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

我回答“不”。这里,当Thread-1处于synchronizedmethod1()时,它必须持有对象监视器上的锁,并且只有当它退出synchronizedMethod1()后才会释放对象监视器上锁。所以,Thread-2必须等待Thread-1释放对象监视器上的锁,这样它才能进入synchronizedmethod2()。

但还是请告知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()
        { html" target="_blank">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个答案

徐凌
2023-03-14

您的代码如下所示:

void method1(){
      synchronized(this) {
           //...
      }
}

synchronized void method2(){
      synchronized(this) {
           //...
      }
}

在您的代码中,两个线程不能同时进入两个方法以进行锁争用。您只能在不同的可运行实例上执行,即不同的this。

柯昆杰
2023-03-14

两个线程不能同时持有同一个锁。然而,仅仅因为线程在对象的< code>synchronized方法中,并不意味着它持有锁。例如,它可以对条件变量调用< code>await,并在等待时释放锁。这允许其他线程通过输入< code>synchronized方法来获取锁——毕竟,这正是您所期待的。

殷安顺
2023-03-14

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

 类似资料:
  • 我写了一个启动两个线程的代码片段;一个线程打印所有奇数,而另一个线程打印所有偶数。我使用了内在锁和线程通信命令的组合来实现两个线程的正确交叉。这是我的代码, 以下是我的问题: > 奇数线程在printOdd()函数中执行,而偶数线程在print偶数()函数中执行。我对两个线程都使用一个内在锁;我不明白两个线程怎么能同时存在于各自的同步块中,因为使用了相同的锁。 我从代码中删除了线程通信语句(通知,

  • 我有以下方法将播放器添加到数据库或更新它,如果它已经存在: 这个方法有时由两个不同的线程调用,因此几乎同时执行两次。有时我会得到以下异常: org . H2 . JDBC . jdbcsqlintegrityconstraintviolationexception:唯一索引或主键冲突:" PUBLIC。PUBLIC上的PRIMARY_KEY_B42。玩家(ID)值3”; 这对我来说是有意义的,因为

  • 我有一个情况,我需要启动两个线程一个接一个。我尝试了以下代码片段,在这里我可以启动Thread12,但不能启动Thread2。我怎样才能开始两个......?如何启动两个线程一个接一个...? 代码片段

  • 如果我没有错的话,Thread-1和thread-3正在进入synchronized方法,因为它有两个不同的目标对象。但是为什么线程2进入同步块呢? 请帮助我理解这一点。提前谢了。

  • 本文向大家介绍Java实现的两个线程同时运行案例,包括了Java实现的两个线程同时运行案例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java实现的两个线程同时运行。分享给大家供大家参考,具体如下: 运行结果: 更多java相关内容感兴趣的读者可查看本站专题:《Java进程与线程操作技巧总结》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作