網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
多線程經(jīng)常訪問同一資源可能造成什么問題
競(jìng)態(tài)條件和死鎖
如果兩個(gè)或多個(gè)線程訪問相同的對(duì)象,或者訪問不同步的共享狀態(tài) ,就會(huì)出現(xiàn)競(jìng)態(tài)條件;
為了避免出現(xiàn)該問題,可以鎖定共享的對(duì)象。但是過多的鎖定也會(huì)有麻煩,那就是死鎖;
當(dāng)至少有兩個(gè)線程被掛起,等待對(duì)方解除鎖定。由于兩個(gè)線程都在等待對(duì)方,就出現(xiàn)了死鎖,線程將無限等下去;
要避免同步問題,最好不要在線程之間共享數(shù)據(jù)。當(dāng)然,這并不總是可行的。如果需要共享數(shù)據(jù),就必須使用同步技術(shù);
確保一次只有一個(gè)線程訪問和改變共享狀態(tài)。注意,同步問題與競(jìng)態(tài)條件和死鎖有關(guān)。如果不注意這些問題,就很難在應(yīng)用程序中找到問題的原因,因?yàn)榫€程問題是不定期發(fā)生的。
多線程同時(shí)訪問一個(gè)實(shí)例對(duì)象時(shí), 可以給進(jìn)程加一把鎖來處理。
lock是確保當(dāng)一個(gè)線程位于代碼的臨界區(qū)時(shí),另一個(gè)線程不進(jìn)入臨界區(qū)。
如果其他線程試圖進(jìn)入鎖定的代碼,則它將一直等待(即被阻止),直到該對(duì)象被釋放。
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;
? ? ? ? }
? ? }
}
雙重鎖定:不用讓線程每次都加鎖,而只是在實(shí)例未被創(chuàng)建的時(shí)候再加鎖處理,提高了性能。
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;
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
多線程訪問資源沖突問題
多線程訪問同一資源時(shí),可以用同步機(jī)制解決問題
private Object _lock = new Object();//定義一個(gè)對(duì)象
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{}中的代碼之后釋放_(tái)lock,并且lock{}中的代碼可以被其他線程訪問。
原文鏈接:https://www.cnblogs.com/testsec/p/6624326.html
相關(guān)推薦
- 2022-09-18 Golang?模塊引入及表格讀寫業(yè)務(wù)快速實(shí)現(xiàn)示例_Golang
- 2022-07-10 $route和this.$router區(qū)別
- 2022-09-15 .Net站點(diǎn)設(shè)置多個(gè)路由對(duì)應(yīng)同一個(gè)Action_實(shí)用技巧
- 2023-07-06 css實(shí)現(xiàn)高亮模式和黑暗模式
- 2022-09-18 C++如何判斷一個(gè)數(shù)是不是素?cái)?shù)_C 語(yǔ)言
- 2022-07-14 Android實(shí)現(xiàn)ViewFlipper圖片動(dòng)畫滑動(dòng)_Android
- 2022-09-18 Python中np.linalg.norm()用法實(shí)例總結(jié)_python
- 2022-09-30 Python學(xué)習(xí)之pip包管理工具的使用_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 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錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支