java—线程在调用一个方法后但在该方法的第一条指令之前会失去控制吗?

cczfrluj  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(340)

我需要记录java中不同线程调用方法的确切顺序。我应该使用一个返回非递减长整数的对象timeprovider。我想出的解决办法是:

public synchronized void method() {
    long order = timeProvider.getTime();
    // some stuff that can be run concurrently
}

当然这是一个瓶颈,因为我唯一需要使用同步的地方就是第一行。所以我想知道把代码改成:

public void method() {
    //(1)
    synchronized (timeProvider) {
        long order = timeProvider.getTime();
    }
    // some stuff that can be run concurrently
}

但在这个版本中,我担心正在运行的线程a可能会在标记为(1)的位置失去控制—在方法内部,但在第一条指令之前。然后另一个线程b可以在a调用该方法并执行第一个指令后调用该方法,结果来自timeprovider的命令将被记录为错误。这可能吗?

eoxn13cs

eoxn13cs1#

是:在方法中执行代码的线程可以在第一行之前暂停。
仅仅调用这个方法看起来好像什么都没有发生,但实际上发生了很多事情,特别是堆栈帧的创建。

相关问题