关于可见性大家还有误区的问题 Thread.sleep对其的影响讨论
对于学习可见性,我们应该都看过下面这样的代码,很简单的
public class VisibilityTest {
Integer a = 0;
public static void main(String[] args) throws InterruptedException {
VisibilityTest test = new VisibilityTest();
test.testVisibility();
}
public void testVisibility() {
new Thread(() -> {
System.out.println("thread 1 start ======= a =" + this.a);
while (this.a != 10) {
}
System.out.println("thred 1 a =======" + this.a);
System.out.println("thread 1 end =======");
}).start();
try {
Thread.sleep(1000L);
// TimeUnit.NANOSECONDS.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() -> {
System.out.println("thread 2 modify ....");
this.a = 10;
System.out.println("thread 2 modify success a = " + this.a);
}).start();
}
}
上面这个代码大概率的运行结果会是这样的:
thread 1 start ======= a =0
thread 2 modify ....
thread 2 modify success a = 10
然后main方法一直停止不掉;
那如果我们将Thread.sleep()这个去掉了,即使线程1先运行,但程序依然会执行成功;
public void testVisibility() {
new Thread(() -> {
System.out.println("thread 1 start ======= a =" + this.a);
while (this.a != 10) {
}
System.out.println("thred 1 a =======" + this.a);
System.out.println("thread 1 end =======");
}).start();
new Thread(() -> {
System.out.println("thread 2 modify ....");
this.a = 10;
System.out.println("thread 2 modify success a = " + this.a);
}).start();
}
thread 1 start ======= a =0
thread 2 modify ....
thread 2 modify success a = 10
thred 1 a =======10
thread 1 end =======
那这跟我们所了解的可见性好像有点区别啊?
为什么Thread.sleep()会影响到主内存中的值刷新到线程1中的工作内存中去了?因为线程2运行完了,它会通过原子操作将以前进行assign的值,通过store,write这些原子操作设置到主内存中去;但我加了Thread.sleep(1000L)这行代码时,我运行main方法,程序会等很久,线程1不会完成(也即线程1的工作内存副本一直没有获取到主内存中的最新值);但是我不加这行代码,线程1即使比线程2先运行,它也会很快的刷新到主内存中的值;
那么带着这个疑问,我将方法体中Thread.sleep(1000L)改成了TimeUnit.NANOSECONDS.sleep(1); 我让主线程休眠1纳秒;这时,我测试j时,跟方法体中不加这行代码一样,线程1也会很快的读取到主内存中的值;
上面这些测试都是在windows系统中测试的;由些可见,Thread.sleep会影响主内存与工作副本中的值的刷新时间,而且影响有点大;不知道有相关了解的大佬们能给个合理的解释不?
相关推荐
JAVA工程师面试测试附答案
**- **知识点**:Java包管理- **解析**:通常涉及导入包时的常见误区。**18.
Windows进程可见性控制原理与工程实践
进程可见性是Windows系统安全与管理的基础概念,其核心在于对象管理器(Object Manager)对EPROCESS结构体的枚举与访问控制。理解Psapi、Toolhelp32等API的底层差异,掌握用户态隔离(如CreateProcessAsUser+空桌面)与内核态过滤(ObRegisterCallbacks)的技术原理,有助于构建稳定、合规的进程保护机制。该技术在金融终端防注入、工业软件防误终止等合法场景中具备明确工程价值,但需严格遵循最小权限、用户授权与可审计原则。本文聚焦C++驱动开发视角下
高校及科研院所如何利用外部数据完善技术转移转化机制.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
完全复现虚拟同步发电机VSG自适应惯量阻尼控制仿真、根轨迹、调节系数对比(Simulink仿真、Matlab代码实现)
内容概要:本文档围绕“【完全复现】虚拟同步发电机VSG自适应惯量阻尼控制仿真、根轨迹、调节系数对比”这一主题,利用Simulink和Matlab平台,系统性地实现了虚拟同步发电机(VSG)的自适应惯量与阻尼控制策略的建模与仿真。内容涵盖VSG的核心控制原理、系统动态响应特性分析、根轨迹绘制以及在不同调节系数下的性能对比研究,旨在深入剖析关键控制参数对系统稳定性与动态性能的影响机制,为新能源并网系统中提升频率支撑能力和暂态稳定性的控制策略设计提供理论依据和技术支持。; 适合人群:具备扎实的电力系统分析与自动控制理论基础,熟练掌握Matlab/Simulink仿真工具,主要从事新能源发电、微电网运行、电力电子变换器控制或电力系统稳定研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①开展虚拟同步发电机(VSG)的建模与先进控制策略的深入研究;②探究自适应惯量与阻尼控制对改善电网频率响应速度和平抑功率波动的作用机理;③运用根轨迹法进行系统稳定性分析,并指导控制器参数的优化整定;④完成高水平学术论文撰写或科研项目申报所需的仿真复现实验。; 阅读建议:本资源以“完全复现”为核心目标,提供了完整的仿真模型与配套代码。使用者应在深入理解同步发电机转子运动方程、虚拟惯量及阻尼物理意义的基础上,结合电力系统暂态稳定理论,逐步操作并调试仿真模型,尤其需关注不同调节系数变化对系统动态性能指标(如超调量、调节时间)的影响,从而深化对VSG内在控制机制与稳定边界的认知。
员工满意度数据集(11列,12000 条记录)CSV 合成
详情介绍:该 HR 员工数据集含 12,000 条 ×11 列(满意度、绩效评估、项目数、月均工时、司龄、工伤、福利包、晋升、部门、薪资),无缺失值但无离职标签列,且存在数据质量问题(141 条负绩效评估、144 条负工时、49.4% 异常高工伤率、项目数仅 0/1/2),疑似经过修改或合成,不能直接做经典的员工离职预测,适合做满意度回归、薪资三分类、晋升预测或员工聚类分析,使用前必须清洗异常值并注意数据真实性限制。


Java SE
