首页 > 解决方案 > 线程在调用方法之后但在方法的第一条指令之前会失去控制吗?

问题描述

我需要记录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 的顺序将被记录错误。这可能吗?

标签: javaconcurrencythread-synchronization

解决方案


是:方法内执行代码的线程可以在第一行之前停止。

仅仅调用该方法可能看起来好像什么也没发生,但实际上发生了很多事情,尤其是堆栈帧的创建。


推荐阅读