[英]Calling java timer in a synchronized block of codes
如果我有一个称为A的父代码块,则A被同步。 在A中,我执行了一个称为B的代码子块。我是否也认为B也将被同步?
如果在AI中有一个计时器在一定的t时间内延迟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
或已从另一个同步方法(例如, public synchronized methodC()
) public synchronized methodC()
或使用了另一个同步机制,否则methodB()
将不会同步。
这些只是最简单的情况。 你已经开发布示例的代码,因为“块”没有很好默认定义和同步锁的类型(关于隐式更好this
通过同步方法与明确的对象锁)有差别。
但是,您的最后一行听起来像是您在询问同步执行代码还是异步执行代码,尽管与线程和synchronized
块有关,但这是一个不同的概念。
在那种情况下,这取决于在block A
发生的事情……如果创建了新的线程来执行block B
那么在代码执行的时间上可能发生任何事情。 如果没有创建线程,则可以安全地假设block A
在block B
之前不会完成。
编辑:基于现在发布的代码...同步的A block
将仅确保一次创建Timer线程。 但是,除非Java Timer
框架有什么特别之处,否则没有什么可以阻止两个线程在run
方法中同时执行B block
的…所以确保内容是线程安全的。
也就是说,不要仅仅因为在相同的延迟下在同步块中创建了Timer
不同实例,就不会假设它们不会同时进入run方法。 如果B block
访问外部的非线程安全代码(例如,静态方法,磁盘访问),您可能会感到惊讶。
正如Amm Sokun在其他答案中提到的那样, A{}
将在Block B
执行之前返回。
块B将在A完成执行后执行,这是因为在方法A中,您只是将B调度为在2*60*1000
毫之后运行,而计时器将在2*60*1000
毫之后执行B
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.