網(wǎng)站首頁 編程語言 正文
多線程經(jīng)常訪問同一資源可能造成什么問題
競態(tài)條件和死鎖
如果兩個或多個線程訪問相同的對象,或者訪問不同步的共享狀態(tài) ,就會出現(xiàn)競態(tài)條件;
為了避免出現(xiàn)該問題,可以鎖定共享的對象。但是過多的鎖定也會有麻煩,那就是死鎖;
當(dāng)至少有兩個線程被掛起,等待對方解除鎖定。由于兩個線程都在等待對方,就出現(xiàn)了死鎖,線程將無限等下去;
要避免同步問題,最好不要在線程之間共享數(shù)據(jù)。當(dāng)然,這并不總是可行的。如果需要共享數(shù)據(jù),就必須使用同步技術(shù);
確保一次只有一個線程訪問和改變共享狀態(tài)。注意,同步問題與競態(tài)條件和死鎖有關(guān)。如果不注意這些問題,就很難在應(yīng)用程序中找到問題的原因,因為線程問題是不定期發(fā)生的。
多線程同時訪問一個實例對象時, 可以給進(jìn)程加一把鎖來處理。
lock是確保當(dāng)一個線程位于代碼的臨界區(qū)時,另一個線程不進(jìn)入臨界區(qū)。
如果其他線程試圖進(jìn)入鎖定的代碼,則它將一直等待(即被阻止),直到該對象被釋放。
public class Singleton
{
? ? private static Singleton instance;
? ? private static readonly object synRoot=new object();
? ? private Singleton() //改為私有
? ? {
? ? }
? ? public static Singleton GetInstance()
? ? {
? ? ? ? lock(synRoot)
? ? ? ? {
? ? ? ? ? ? if(instance==null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? instance=new Singleton();
? ? ? ? ? ? }
? ? ? ? ? ? return instance;
? ? ? ? }
? ? }
}
雙重鎖定:不用讓線程每次都加鎖,而只是在實例未被創(chuàng)建的時候再加鎖處理,提高了性能。
public class Singleton
{
? ? private static Singleton instance;
? ? private static readonly object synRoot=new object();
? ? private Singleton() //改為私有
? ? {
? ? }
? ? public static Singleton GetInstance()
? ? {
? ? ? ? if(instance==null)
? ? ? ? {
? ? ? ? ? ?lock(synRoot)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(instance==null)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? instance=new Singleton();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return instance;
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
多線程訪問資源沖突問題
多線程訪問同一資源時,可以用同步機(jī)制解決問題
private Object _lock = new Object();//定義一個對象
private void method( paramtype,paramvalue) //線程訪問方法名
{
lock (_lock)
{
//沖突代碼
}
}
1. _lock 被lock了嗎?沒有則由當(dāng)前線程來lock,否則一直等待,直至_lock 被釋放。
2. lock以后在執(zhí)行l(wèi)ock{}中的代碼期間其他線程不能調(diào)用lock{}{中的代碼,也不能使用_lock。
3. 執(zhí)行完lock{}中的代碼之后釋放_lock,并且lock{}中的代碼可以被其他線程訪問。
原文鏈接:https://www.cnblogs.com/testsec/p/6624326.html
相關(guān)推薦
- 2023-11-21 高階函數(shù)HoF:用filter()方法編寫一個素數(shù)生成函數(shù)primes()
- 2022-08-16 C/C++函數(shù)的調(diào)用約定的使用_C 語言
- 2023-03-22 Linux?rm命令詳解?Linux刪除文件目錄的操作方法_linux shell
- 2021-12-05 CentOS7環(huán)境下gcc(版本10.2.0)升級詳細(xì)過程_Linux
- 2022-06-07 FreeRTOS實時操作系統(tǒng)移植操作示例指南_操作系統(tǒng)
- 2023-01-23 重啟后nvidia-smi命令不可執(zhí)行出現(xiàn)“Make?sure?that?the?latest?NV
- 2022-11-08 C/C++實現(xiàn)遍歷文件夾最全方法總結(jié)_C 語言
- 2024-01-15 Stream流 - 獲取Stream和轉(zhuǎn)換操作(含基本數(shù)據(jù)類型流)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支