内部类的java同步方法

2guxujil  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(458)

如果一个内部类的方法被标记为synchronized,那么这个方法实际获得了哪个锁?外部物体还是内部物体?
起初,我认为它是内部对象,但当我看到一个代码片段:sample internal class, stateMachine 甚至不是内部类的成员,而是外部类的成员,所以我想知道获取的锁是否是外部对象?
谢谢您

l3zydbqr

l3zydbqr1#

它将在方法所属的对象上同步。

public class SyncTest{
    class B{
        synchronized void runTest(){
            System.out.println("running");
        }
    }
    synchronized void check() throws Exception{
        B b = new B();
        new Thread( ()-> b.runTest() ).start();
        System.out.println("waiting");
        Thread.sleep(100);
        System.out.println("finished");
    }
    public static void main(String[] args) throws Exception {

        new SyncTest().check();
    }

}

这个例子,如果 runTest 已在外部对象上同步,线程无法运行,直到 check 方法已完成。它实际上是在内部类的示例上同步的。
这是在打印“running”时要查看的比赛条件。它可以是第一次,也可以是在“等待”之后,很少有可能是在“完成”之后。
我们可以修改“runtest”程序以在outter示例上同步。

synchronized( SyncTest.this ){
    System.out.println("running");
}

现在“running”总是最后打印,因为它必须等待“check”方法完成,因为它们在同一个对象上是同步的。

相关问题