gpt4 book ai didi

java - 在同步代码块中调用java计时器

转载 作者:行者123 更新时间:2023-12-01 22:15:20 24 4
gpt4 key购买 nike

如果我有一个称为 A 的父代码块,则 A 是同步的。在 A 中,我执行了一个名为 B 的子代码块。我是否可以假设 B 也会同步?


如果在A中我有一个计时器将B的执行延迟一段t时间,那么当A已经完成时B是否有机会稍后执行?


非常感谢。


P/S:抱歉,代码不清楚,它应该是这样的

   synchronized  A{
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
B block
}
}, 2*60*1000);

}

最佳答案

视情况而定。如果 block 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()不同步。

这些只是最简单的情况。您最好发布示例代码,因为默认情况下“ block ”没有明确定义,并且同步锁的类型(通过同步方法隐式 this 与显式对象锁)会有所不同。

但是,您的最后一行听起来像是您在询问代码的同步执行与异步执行,虽然与线程和同步块(synchronized block)相关,但这是一个不同的概念。

在这种情况下,这取决于 block A 中发生的情况...如果创建新线程来执行 block B,那么随着代码的计时,任何事情都可能发生执行。如果没有创建线程,则可以安全地假设 block A 不会在 block B 之前完成。

编辑:基于现在发布的代码...同步的A block 将仅确保一次创建一个计时器线程。但是,除非 Java Timer 框架有什么特殊之处,否则没有什么可以阻止两个线程执行 run 方法中的 B block 同时...因此请确保内容是线程安全的。

也就是说,不要假设仅仅因为 Timer 的不同实例是在具有相同延迟的同步块(synchronized block)中创建的,它们就不会同时进入 run 方法。如果B block 访问外部非线程安全代码(例如静态方法、磁盘访问),您可能会感到惊讶。

正如 Amm Sokun 在其他答案中提到的,A{} 将在 之前返回
block B
执行。

关于java - 在同步代码块中调用java计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31184863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com