日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java并发编程的艺术(一)——并发编程需要注意的问题

發布時間:2025/3/18 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java并发编程的艺术(一)——并发编程需要注意的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/qq_34173549/article/details/79612496

并發是為了提升程序的執行速度,但并不是多線程一定比單線程高效,而且并發編程容易出錯。若要實現正確且高效的并發,就要在開發過程中時刻注意以下三個問題:

  • 上下文切換
  • 死鎖
  • 資源限制

接下來會逐一分析這三個問題,并給出相應的解決方案。

問題一:上下文切換會帶來額外的開銷

線程的運行機制

  • 一個CPU每個時刻只能執行一條線程;
  • 操作系統給每條線程分配不同長度的時間片;
  • 操作系統會從一堆線程中隨機選取一條來執行;
  • 每條線程用完自己的時間片后,即使任務還沒完成,操作系統也會剝奪它的執行權,讓另一條線程執行

什么是“上下文切換”?

當一條線程的時間片用完后,操作系統會暫停該線程,并保存該線程相應的信息,然后再隨機選擇一條新線程去執行,這個過程就稱為“線程的上下文切換”。

上下文切換的過程

  • 暫停正在執行的線程;
  • 保存該線程的相關信息(如:執行到哪一行、程序計算的中間結果等)
  • 從就緒隊列中隨機選一條線程;
  • 讀取該線程的上下文信息,繼續執行

上下文切換是有開銷的

每次進行上下文切換時都需要保存當前線程的執行狀態,并加載新線程先前的狀態。?
如果上下文切換頻繁,CPU花在上下文切換上的時間占比就會上升,而真正處理任務的時間占比就會下降。?
因此,為了提高并發程序的執行效率,讓CPU把時間花在刀刃上,我們需要減少上下文切換的次數。

如何減少上下文切換?

  • 減少線程的數量?
    由于一個CPU每個時刻只能執行一條線程,而傲嬌的我們又想讓程序并發執行,操作系統只好不斷地進行上下文切換來使我們從感官上覺得程序是并發執的行。因此,我們只要減少線程的數量,就能減少上下文切換的次數。?
    然而如果線程數量已經少于CPU核數,每個CPU執行一條線程,照理來說CPU不需要進行上下文切換了,但事實并非如此。

  • 控制同一把鎖上的線程數量?
    如果多條線程共用同一把鎖,那么當一條線程獲得鎖后,其他線程就會被阻塞;當該線程釋放鎖后,操作系統會從被阻塞的線程中選一條執行,從而又會出現上下文切換。?
    因此,減少同一把鎖上的線程數量也能減少上下文切換的次數。

  • 采用無鎖并發編程?
    我們知道,如果減少同一把鎖上線程的數量就能減少上下文切換的次數,那么如果不用鎖,是否就能避免因競爭鎖而產生的上下文切換呢??
    答案是肯定的!但你需要根據以下兩種情況挑選不同的策略:

  • 需要并發執行的任務是無狀態的:HASH分段?
    所謂無狀態是指并發執行的任務沒有共享變量,他們都獨立執行。對于這種類型的任務可以按照ID進行HASH分段,每段用一條線程去執行。
  • 需要并發執行的任務是有狀態的:CAS算法?
    如果任務需要修改共享變量,那么必須要控制線程的執行順序,否則會出現安全性問題。你可以給任務加鎖,保證任務的原子性與可見性,但這會引起阻塞,從而發生上下文切換;為了避免上下文切換,你可以使用CAS算法, 僅在線程內部需要更新共享變量時使用CAS算法來更新,這種方式不會阻塞線程,并保證更新過程的安全性。

問題二:并發不當可能會產生死鎖

什么是“死鎖”?

當多個線程相互等待已經被對方占用的資源時,就會產生死鎖。

死鎖示例

class DeadLock {// 鎖A private Object lockA;// 鎖Bprivate Object lockB;// 第一條線程Thread t1 = new Thread(new Runnable(){void run () {synchronized (lockA) {Thread.sleep(5000);synchronized (lockB) {System.out.println("線程1");}}}}).start();// 第二條線程Thread t2 = new Thread(new Runnable(){void run () {synchronized (lockB) {Thread.sleep(5000);synchronized (lockA) {System.out.println("線程2");}}}}).start(); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 線程1和線程2都需要鎖A和鎖B
  • 線程1首先獲得鎖A,然后sleep 5秒?
    PS:線程sleep過程中會釋放執行權
  • 此時線程2執行,獲得鎖B,然后也sleep 5秒;
  • 線程1 sleep 5秒后繼續執行,此時需要鎖B,然而鎖B已經被線程2持有,因此線程1被阻塞;
  • 此時線程2醒了,它需要鎖A,然而鎖A已經被線程1持有,因此它也被阻塞;
  • 此時死鎖出現了!兩條線程相互等待已經被占用的資源,程序就死在這了。?
    死鎖是并發編程中一個重要的問題,上面介紹的減少上下文切換只是為了提升程序的性能,而一旦產生死鎖,程序就不能正確執行!

如何避免死鎖?

  • 不要在一條線程中嵌套使用多個鎖;
  • 不要在一條線程中嵌套占用多個計算機資源;
  • 給鎖和資源加超時時間?
    如果你非要在一條線程中嵌套使用多個鎖或占用多個資源,那你需要給鎖、資源加超時時間,從而避免無限期的等待。

問題三:計算機資源會限制并發

誤區:線程越多速度越快

在并發編程中,并不是線程越多越好,有時候線程多了反而會拉低執行效率,原因如下:

  • 線程多了會導致上下文切換增多,CPU花在上下文切換的時間增多后,花在處理任務上的時間自然就減少了。
  • 計算機資源會限制程序的并發度。?
    • 比如:你家網入口帶寬10M,你寫了個多線程下載的軟件,同時開100條線程下載,那每條線程平均以每秒100k的速度下載,然而100條線程之間還要不斷進行上下文切換,所以你還不如只開5條線程,每條平均2M/s的速度下載。
    • 再比如:數據庫連接池最多給你用10個連接,然而你卻開了100條線程進行數據庫操作,那么當10個用完后其他線程就要等待,從而操作系統要在這100條線程間不斷進行上下文切換;所以與其這樣還不如只開10條線程,減少上下文切換的次數。

說了這么多只想告訴你一個道理:線程并不是越多越好,要根據當前計算機所能提供的資源考慮。

什么是“資源”?

資源分為硬件資源和軟件資源:

  • 硬件資源?
    • 硬盤讀寫速度
    • 網絡帶寬
  • 軟件資源?
    • Socket連接數
    • 數據庫連接數

如何解決資源的限制?

  • 花錢買更高級的機器
  • 根據資源限制并發度

總結

以上是生活随笔為你收集整理的Java并发编程的艺术(一)——并发编程需要注意的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日批视频免费播放 | av制服丝袜在线 | 免费国产在线观看 | www.一起操 | 性高潮在线观看 | 99精品久久久 | 国产日韩欧美综合在线 | 熟女一区二区三区视频 | 性色av一区二区三区在线观看 | 欧美老女人bb | 香蕉视频网址 | 日本免费三区 | 三级网站在线播放 | 国产人妖视频 | 激情视频一区 | 成年网站免费在线观看 | 欧美激情亚洲综合 | 一卡二卡三卡在线 | 蜜美杏av | 公侵犯一区二区三区 | 男人的天堂一区 | 欧美精品欧美精品系列 | 在线免费观看成人 | 色偷偷免费| 日韩精品一区二区视频 | 青青毛片 | 国产人成视频在线观看 | 精品人妻互换一区二区三区 | 日韩精品中文字幕在线 | 免费一级毛片麻豆精品 | 成年人免费看黄色 | 99九九精品视频 | 亚洲大胆视频 | 久久黄色网络 | 黄色免费91 | 国产午夜精品理论片 | 欧美成人免费一级人片100 | 中文字幕免费 | 最新中文字幕视频 | 亚洲综合一区中 | 欧美影院一区 | 亚洲人成色777777老人头 | 草草久久久| 精品国产成人亚洲午夜福利 | 91久久人澡人人添人人爽欧美 | 91色爱| 亚洲天堂一| 伊人射| 亚洲免费三级 | 成人综合在线视频 | 69人人| 欧美日韩一级二级三级 | 91高清免费视频 | 欧洲一级视频 | 日韩激情视频网站 | 午夜激情啪啪 | 国产免费网 | 91在线无精精品入口 | 欧美性猛交xx | 成人在线观看免费视频 | 理想之城连续剧40集免费播放 | 一级黄色在线播放 | 久久久精品视频在线 | 天天燥日日燥 | 欧美日韩国产免费一区二区三区 | 日韩黄色免费看 | 色婷婷九月 | 欧美肥妇bwbwbwbxx | 亚洲色图在线视频 | 日本不卡一二三区 | 国产精品久久久久精 | 欧美精品一区二区不卡 | 久久久久女教师免费一区 | 久久久久无码国产精品一区李宗瑞 | 欧美日韩国产精品综合 | 四虎免费av | 日韩欧美亚洲在线 | 三级在线观看网站 | 777米奇影视第四色 五月丁香久久婷婷 | 中文字幕日韩亚洲 | 国产精品高潮呻吟久久久久久 | 深夜精品福利 | 波多野结衣在线影院 | 自拍1区| 一区二区在线视频播放 | 男人天堂av电影 | 国产精品制服诱惑 | 一区二区视屏 | 免费一级片视频 | 亚洲激情中文字幕 | 女人夜夜春 | 亚洲成人av一区二区三区 | 精品日韩在线播放 | 毛片av在线 | 亚洲一级在线 | 国产日产欧美一区二区三区 | 99视频在线观看免费 | 午夜一区二区三区在线 | 伊人久久国产精品 |