我需要记录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的命令将被记录为错误。这可能吗?
1条答案
按热度按时间eoxn13cs1#
是:在方法中执行代码的线程可以在第一行之前暂停。
仅仅调用这个方法看起来好像什么都没有发生,但实际上发生了很多事情,特别是堆栈帧的创建。