0

如果我有一个名为 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);

    } 
4

2 回答 2

2

要看。如果块 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执行前返回。

于 2015-07-02T13:03:17.250 回答
1

块 B 将在 A 执行完成后执行,这是因为在方法 A 中,您只是将 B 调度为在2*60*1000milli 之后运行,而 timer 将负责在2*60*1000milli之后执行 B

于 2015-07-02T13:15:02.903 回答