当前位置: 首页 > 面试题库 >

是否同时执行两个同步方法

邹博明
2023-03-14
问题内容

我有4种方法(m1m2m3m4一类)。方法m1m2m3synchronized方法。另外,我有4个线程t1t2t3t4分别。

如果t1访问m1方法(同步方法),t2线程访问m2方法(同步方法)是否可以同时进行?如果不是,则t2的状态如何?


问题答案:

如果t1访问m1方法(同步方法),t2线程可以同时访问m2方法(同步方法)吗?

synchronized关键字适用于 目标水平 ,且只有一个线程可持有对象的锁。因此,只要您在谈论同一个对象,那么
t2它将等待t1释放进入时获得的锁m1

但是,线程可以通过调用来释放锁而无需从方法中返回Object.wait()

如果不是,则t2的状态是什么?

它会紧紧地等待t1释放锁(从方法返回或调用Object.wait())。具体来说,它将处于BLOCKED状态。

线程的线程状态被阻塞,等待监视器锁定。
处于阻塞状态的线程正在等待监视器锁定以输入同步块/方法,或者在调用后重新输入同步块/方法Object.wait

样例代码:

public class Test {

    public synchronized void m1() {
        try { Thread.sleep(2000); }
        catch (InterruptedException ie) {}
    }

    public synchronized void m2() {
        try { Thread.sleep(2000); }
        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(t2.getState());
    }
}

输出:

BLOCKED


 类似资料:
  • 一旦遇到这样的问题,这里还有更多内容,然后发现了 一个适当恶劣的解决方法。 这篇文章没有列在索引中,但是为满足你的好奇心而保留了下来。

  • 问题内容: 如果一个同步方法调用另一个同步方法,那么线程安全吗? 问题答案: 是的,将方法标记为时,您实际上是在这样做: 当线程调用从method1进入method2时,它将确保它持有对的锁定,该锁定已经存在,然后可以通过。 当线程直接进入method1或method2时,它将阻塞直到获得锁(),然后进入。 正如詹姆斯·布莱克(James Black)在评论中指出的那样,您必须了解方法主体内部的操

  • 问题内容: public class Deadlock { static class Friend { private final String name; public Friend(String name) { this.name = name; } public String getName() { return this.name; } public synchronized void b

  • 问题内容: 我面临有关Java方法同步的问题。希望我能简要解释一下: 我在两个不同的类中,在两个不同的包中有两个不同的方法。就像是: 好的,所以现在我需要同步这两个 不是thread的方法 。到目前为止,我有两种不同的方法: 共享信号量 。 在和外部创建一个共享的静态信号量,例如: 无论如何,我真的不知道JVM是否会将其视为共享信号量。 已同步(SharedClass.class) 。 使用共享类

  • 问题内容: 我在理解同步关键字功能时遇到了一些麻烦。根据Java文档和其他教程,可以说,当使用synced关键字时,在两个线程之间不可能在该方法的语句之间进行交织。 但是,请参见下面的代码。 据我了解,程序输出应始终以线程0和线程1不应交错的方式进行。但是多次执行这段代码后,我得到了交错输出。 请帮助我理解问题。 提前致谢.. 问题答案: 的关键字防止两个线程运行的是在同一对象上同步代码。 您的每