要看。如果块 B 是这样的方法中的代码块,那么是的......它将被同步。
public synchronized void methodA() {
// Block B
{
// some code
}
}
如果是类似以下的另一种方法,则否:
public synchronized void methodA() {
methodB();
}
public void methodB() {
// Block B code
// Nothing prevents an unsynchronized method from calling this method
// at same time as methodA() holds lock on `this` object
}
除非methodB
也被标记synchronized
或从另一个同步方法(例如 / public synchronized methodC()
)调用或使用另一个同步机制,否则methodB()
不同步。
这些只是最简单的情况。您最好发布示例代码,因为默认情况下没有很好地定义“块”,并且同步锁的类型(this
通过同步方法隐式与显式对象锁)会有所不同。
但是,您的最后一行听起来像是在询问代码的同步与异步执行,虽然与线程和synchronized
块相关,但这是一个不同的概念。
在这种情况下,这取决于block A
......如果创建新线程来执行,block B
那么任何事情都可能发生在代码执行的时间上。如果没有创建线程,则可以安全地假设它block A
不会在block B
.
编辑:基于现在发布的代码......同步A block
只会确保一次创建一个定时器线程。但是,除非 Java 框架有什么特别之处,否则没有Timer
什么可以阻止两个线程同时执行方法B block
中的run
……所以要确保内容是线程安全的。
也就是说,不要假设仅仅因为Timer
在同步块中以相同的延迟创建了不同的实例,它们就不会同时进入运行方法。如果B block
访问外部非线程安全代码(例如静态方法、磁盘访问),您可能会感到意外。
正如 Amm Sokun 在其他答案中提到的,A{}
将在
Block B
执行前返回。