網站首頁 編程語言 正文
可見性–線程工作內存造成的異常情況
1.使用多線程造成的死循環情況
代碼實例:
//測試可見性
public class RunThread extends Thread{
private boolean isRunning = true;
public boolean isRunning(){
return isRunning;
}
public void setRunning(boolean isRunning){
this.isRunning = isRunning;
}
@Override
public void run() {
System.out.println("進入run了");
while (isRunning == true){
}
System.out.println("線程被停止了!");
}
}
//測試
public static void main(String[] args) {
try {
RunThread thread = new RunThread();
thread.start();
Thread.sleep(1000);
thread.setRunning(false);
System.out.println("已經賦值為false了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
執行結果出現了死循環情況
輸出結果:
為什么會出現這種情況?怎么解決?
-
出現死循環的原因
程序陷入空循環,主要是由于isRunning變量存在于公共堆棧和線程的私有堆棧,線程運行后,一直在私有堆棧中獲取變量值,而代碼的"thread.setRunning(false);"更新的是公共堆棧中的值,所以程序處于死循環中。
線程私有的內存結構:
-
解決辦法
使用volatile關鍵字,當變量使用volatile時,會直接從主內存中獲取變量,從而使操作的為同一變量,程序即可正常退出。
private volatile boolean isRunning = true;
volatile操作的結構圖:
總結:
- 線程間可見性是指:線程不從工作內存獲取,直接從主內存獲取值。
- 通過使用volatile關鍵字可以增加實例變量在多個線程間的可見性。
原文鏈接:https://blog.csdn.net/CAUC_lin/article/details/125338387
相關推薦
- 2023-09-18 springboot異常處理的一點總結
- 2022-04-26 SQL?Server中Sequence對象用法_MsSql
- 2022-08-15 linux環境下查看日志文件的一些操作
- 2022-11-15 python內置模塊OS?實現SHELL端文件處理器_python
- 2023-10-16 element組件autofocus( 自動獲取焦點)失效
- 2023-06-20 IDEA中的Redis插件連接Redis服務器_Redis
- 2022-07-21 A component required a bean of type ‘com.ruoyi.sea
- 2022-12-24 一文帶你輕松學會Go語言動態調用函數_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支