java - 线程在调用方法之后但在方法的第一条指令之前会失去控制吗?
问题描述
我需要记录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 的顺序将被记录错误。这可能吗?
解决方案
是:方法内执行代码的线程可以在第一行之前停止。
仅仅调用该方法可能看起来好像什么也没发生,但实际上发生了很多事情,尤其是堆栈帧的创建。
推荐阅读
- laravel - 检查下一个运行 Laravel 的时间表是什么时候
- sql - SQL Server 选择列中的所有最大和最小数据
- delphi - TDBNavigator 背景透明度颜色错误
- python - 如何使用字典值中的精确字符串创建新列表?
- java - 将响应转换为字符串 JAVA 时出现 500 状态
- c - 如何集成模块?
- java - Jackson - 基于多个属性的自定义 TypeId 解析器
- python - 使用 nginx 运行 Python 脚本
- ios - 以编程方式快速添加 CollectionView 项目
- reactjs - 如何使用 React gatsby-background-image 重复背景图像?