如果一个同步方法调用另一个非同步方法,该非同步方法是否有锁
答案取决于上下文。
如果您处于synchronized
对象的方法,然后由其他线程调用同一对象实例的其他方法,这些方法也是synchronized
被锁定。然而,其他线程对非同步方法的调用是not锁定 – 任何人都可以同时呼叫他们。
public synchronized void someSynchronizedMethod() {
...
someNonSynchronizedMethod();
...
}
// anyone can call this method even if the someSynchronizedMethod() method has
// been called and the lock has been locked
public void someNonSynchronizedMethod() {
...
}
另外,如果您致电someSynchronizedMethod()
但恰好在someNonSynchronizedMethod()
方法,你仍然持有锁。当您进入同步方法(或块)时,锁定将启用,而当您退出该方法时,锁定将被禁用。您可以调用各种其他非同步方法,它们仍然会被锁定。
但你在问题中问了两个不同的事情:
在Java中,如果一个同步方法包含对非同步方法的调用,那么另一个方法是否仍然可以同时访问该非同步方法?
是的。其他方法可以访问非同步方法。
基本上我要问的是同步方法中的所有内容都有锁(包括对其他同步方法的调用)?
呃,是的。其他电话至同步的方法被锁定。但非同步方法不会被锁定。
另外,请记住,如果该方法是static
那么锁就在Class
对象在ClassLoader
.
// this locks on the Class object in the ClassLoader
public static synchronized void someStaticMethod() {
如果该方法是实例方法,则锁位于类的实例上。
// this locks on the instance object that contains the method
public synchronized void someInstanceMethod() {
这两种情况下有两种不同的锁。
最后,当你处理synchronized
实例方法,每个instance类的内容是被锁定的。这意味着两个线程可以在同一个线程中synchronized
同时采用不同的方法实例。但是如果有 2 个线程尝试操作synchronized
同一实例上的方法,一个将阻塞,直到另一个退出该方法。