在同步代码块中调用 java 计时器
Calling java timer in a synchronized block of codes
如果我有一个名为 A 的父代码块,则 A 是同步的。在 A 中,我执行了一个名为 B 的子代码块。我是否正确地假设 B 也将被同步?
如果在A中我有一个timer可以让B在某个时间延迟执行,有没有可能在A已经执行完之后再执行B?
非常感谢。
P/S:抱歉代码不清晰,这应该是这样的
synchronized A{
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
B block
}
}, 2*60*1000);
}
视情况而定。如果块 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
或从另一个同步方法调用(eg/public synchronized methodC()
)或使用了另一种同步机制,则methodB()
不同步
这些只是最简单的情况。你最好发布示例代码,因为默认情况下 'block' 没有很好地定义并且同步锁的类型(通过同步方法隐含在 this
上与显式对象锁)有所不同。
但是,你的最后一行听起来像是在询问代码的同步执行与异步执行,虽然与线程和 synchronized
块相关,但这是一个不同的概念。
在那种情况下,这取决于 block A
中发生的事情......如果创建新线程来执行 block B
那么任何事情都可能随着代码执行的时间而发生。如果没有创建线程,可以安全地假设 block A
不会在 block B
.
之前完成
编辑:基于现在发布的代码...同步 A block
将仅确保一次创建一个定时器线程。但是,除非 Java Timer
框架有什么特别之处,否则没有什么可以阻止两个线程同时执行 run
方法中的 B block
...所以使确保内容是线程安全的。
也就是说,不要假设仅仅因为 Timer
的不同实例是在具有相同延迟的同步块中创建的,它们不会同时进入 运行 方法时间。如果 B block
访问外部非线程安全代码(例如静态方法、磁盘访问),您可能会大吃一惊。
正如 Amm Sokun 在其他答案中提到的,A{}
将在
Block B
执行之前 return。
块 B 将在 A 执行完毕后执行,这是因为在方法 A 中,您只是将 B 安排在 2*60*1000
之后 运行,定时器将负责执行 B在 2*60*1000
毫
之后
如果我有一个名为 A 的父代码块,则 A 是同步的。在 A 中,我执行了一个名为 B 的子代码块。我是否正确地假设 B 也将被同步?
如果在A中我有一个timer可以让B在某个时间延迟执行,有没有可能在A已经执行完之后再执行B?
非常感谢。
P/S:抱歉代码不清晰,这应该是这样的
synchronized A{
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
B block
}
}, 2*60*1000);
}
视情况而定。如果块 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
或从另一个同步方法调用(eg/public synchronized methodC()
)或使用了另一种同步机制,则methodB()
不同步
这些只是最简单的情况。你最好发布示例代码,因为默认情况下 'block' 没有很好地定义并且同步锁的类型(通过同步方法隐含在 this
上与显式对象锁)有所不同。
但是,你的最后一行听起来像是在询问代码的同步执行与异步执行,虽然与线程和 synchronized
块相关,但这是一个不同的概念。
在那种情况下,这取决于 block A
中发生的事情......如果创建新线程来执行 block B
那么任何事情都可能随着代码执行的时间而发生。如果没有创建线程,可以安全地假设 block A
不会在 block B
.
编辑:基于现在发布的代码...同步 A block
将仅确保一次创建一个定时器线程。但是,除非 Java Timer
框架有什么特别之处,否则没有什么可以阻止两个线程同时执行 run
方法中的 B block
...所以使确保内容是线程安全的。
也就是说,不要假设仅仅因为 Timer
的不同实例是在具有相同延迟的同步块中创建的,它们不会同时进入 运行 方法时间。如果 B block
访问外部非线程安全代码(例如静态方法、磁盘访问),您可能会大吃一惊。
正如 Amm Sokun 在其他答案中提到的,A{}
将在
Block B
执行之前 return。
块 B 将在 A 执行完毕后执行,这是因为在方法 A 中,您只是将 B 安排在 2*60*1000
之后 运行,定时器将负责执行 B在 2*60*1000
毫