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();
}
}
1条答案
按热度按时间l3zydbqr1#
它将在方法所属的对象上同步。
这个例子,如果
runTest
已在外部对象上同步,线程无法运行,直到check
方法已完成。它实际上是在内部类的示例上同步的。这是在打印“running”时要查看的比赛条件。它可以是第一次,也可以是在“等待”之后,很少有可能是在“完成”之后。
我们可以修改“runtest”程序以在outter示例上同步。
现在“running”总是最后打印,因为它必须等待“check”方法完成,因为它们在同一个对象上是同步的。