網站首頁 編程語言 正文
可見性–線程工作內存造成的異常情況
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
相關推薦
- 2022-01-20 localStorage 和 sessionStorage 及其用法 對象屬性操作方式
- 2022-06-30 C語言詳細圖解浮點型數據的存儲實現_C 語言
- 2022-10-06 react最流行的生態替代antdpro搭建輕量級后臺管理_React
- 2022-10-16 Python3列表刪除的三種方式實現_python
- 2022-09-05 Spark Sql之count(distinct)分析&&學習&&驗
- 2022-06-18 Elasticsearch之倒排索引及索引操作_python
- 2022-04-08 c++11中std::move函數的使用_C 語言
- 2022-06-09 FreeRTOS實時操作系統的任務應用函數詳解_操作系統
- 最近更新
-
- 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同步修改后的遠程分支