假设有一个类Test,它有一个同步方法m1,一个非同步方法m2,和一个Test实例,比如obj。两个线程T1和T2,尝试访问与实例obj相关的方法。 当T1调用obj.m1(synchronized方法)时,在完成m1执行之前,T2调用obj.m2(非同步)时会发生什么。 T2必须等待吗?
我在接受采访时被问到这个问题。
我的回答: T2会继续执行,无需等待。 T2正在访问非同步方法,因此它不需要任何锁定。
面试官似乎不同意我的回答,但当我回答他的答案是否正确时,他没有提供任何意见。
如果我错过了什么,请帮助我理解。
P.S。我已经尝试过一个测试程序,我看到我的理解是正确的。我只是想知道是否有任何特殊情况,这不会起作用,因为我向面试官解释。
答案 0 :(得分:3)
嗯,你回答肯定是正确的,但我想这个小答案并没有让面试官满意,也许他有更高的期望,并希望对他的问题有一个非常明确的解释。
我不会编写任何代码来回答你的问题,但我会在java中强调multi-threading
的基础知识。
1)每个对象只有一个锁。
2)如果两个线程说T1和T2试图在同一个对象上执行同步实例方法,则首先获得锁定的线程将能够执行synchronized方法,而另一个线程T2必须等到由于一些原因,T1完成其执行或进入阻塞/等待状态。换句话说,No Thread T2不能为对象输入任何(我重复任何)
synchronized
方法" obj"如果线程T1已经锁定了同一个对象obj
。3)如果一个类同时具有同步和非同步方法,那么任何数量的线程都可以以任何方式访问非同步方法,而无需等待某人或某事。
这里的底线是,线程T2在尝试执行非同步方法时不需要等待线程T1完成其执行。希望这个答案符合您的期望。
我看到你编辑了你的问题
P.S。我已经尝试了一个测试程序,我看到我的理解是正确的。我只是想知道是否有任何特殊情况,这不会起作用,因为我向面试官解释 没有这种情况。以上几点应该符合您的问题。