线程能否在调用方法之后但在方法的第一条指令之前失去控制?
Can a thread lose control after calling a method but before the first instruction of the method?
我需要在Java中记录各个线程调用方法的确切顺序。我应该使用 returns 非递减长整数的对象 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 的顺序将被记录为错误。这可能吗?
是:在方法内执行代码的线程可以在第一行之前停止。
调用方法看起来好像什么都没发生,但实际上发生了很多事情,尤其是堆栈帧的创建。
我需要在Java中记录各个线程调用方法的确切顺序。我应该使用 returns 非递减长整数的对象 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 的顺序将被记录为错误。这可能吗?
是:在方法内执行代码的线程可以在第一行之前停止。
调用方法看起来好像什么都没发生,但实际上发生了很多事情,尤其是堆栈帧的创建。