两个同步方法同时执行

Ton*_*ony 32 java multithreading synchronized

我有4种方法(m1,m2,m3m4一类).方法m1,m2m3synchronized方法.另外,我有4个线程t1,t2,t3t4分别.

如果t1访问m1方法(synchronized方法),可以同时进行t2线程访问m2方法(synchronized方法)吗?如果不是t2的状态是什么?

aio*_*obe 45

如果t1访问m1方法(synchronized方法),可以同时进行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());
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

BLOCKED
Run Code Online (Sandbox Code Playgroud)


And*_*yle 11

如果方法在同一监视器上同步,则它们不能在不同的线程中同时执行.当第二个线程进入监视器条目(在这种情况下是同步方法的开始)时,它将阻塞,直到第一个线程释放监视器.

在这种情况下,由jconsole报告的阻塞线程的实际状态将类似于 java.lang.Thread.State: WAITING (on object monitor)

假设所有方法都是普通的实例方法,那么当它们在同一个对象上调用时,它们将共享同一个监视器.也就是说,如果你有类似的东西:

// Thread 1
A a1 = new A();
a1.m1();

// Thread 2
A a2 = new A();
a2.m2()
Run Code Online (Sandbox Code Playgroud)

那么在这种情况下,第二个线程将能够调用该方法,因为它试图获取a2对象的隐式监视器,它被线程1锁定.但是如果线程2试图调用a1.m2(),那么它将阻塞直到线程1完成了执行m1().

如果你有静态方法,那么它们会获得类本身的显式监视器(A.class在我的假设命名情况下),因此不会被任何实例方法调用阻止.