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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

并发编程实战-第二章学习

發布時間:2024/9/5 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 并发编程实战-第二章学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

“共享”意味著變量可以由多個線程同時訪問,而“可變”則意味著變量的值再其聲明周期內可以發生變化。

如果當多個線程訪問同一個可變的狀態變量時沒有使用合適的同步,那么程序就會出現錯誤,有三種方式可以修復這個問題:

  • 不在線程之間共享該狀態變量(有點扯,既然我要共享一個狀態變量,怎么可能不共享,只能說不共享肯定不會涉及狀態的同步)
  • 將狀態變量修改為不可變的變量。
  • 在訪問狀態變量時使用同步

什么是線程安全性

線程安全性的核心是正確性,即當多個線程訪問某個類時,這個類使用都能變現出正確的行為,那么這個類就是線程安全的。

在線程安全性一章中給出的定義:

當多個線程訪問某個類時,不管運行環境采用何種調度凡是或者這些線程將如何交替執行,并且在主調代碼中不需要任何額外的同步或協同,這個類都能變現出正確的行為,那么就稱這個類時線程安全的

無狀態對象一定是線程安全的,無狀態即不包括任何域、也不包括任何對其他類中的域的引用。

?

原子性

原子操作是指,對于訪問同一個狀態的所有操作(包括該操作本身)來說,這個操作是一個原子的操作。(個人理解:所謂的原子,即最小單位,不可再分割,對于操作來說,及時是復合操作,同樣通過加鎖等其他方式將其捆綁在一起完成)

該節提出了產生數據不一致的問題,從而引出了,“先檢查后執行”的操作,即通過一個可能失效的觀察結果來決定下一步的動作。通過舉例了兩個朋友相約咖啡廳的故事進行了描述,通俗易懂,其中我個人認為比較重要的一句----“當你邁出前門時,你在星巴克A的觀察結果將變得無效,因為他可能已經從后門進入了星巴克,只是你不知道而已”。、

通過long的couut操作說明了符合操作,++count,涉及的操作為讀取-修改-寫入三部分操作,通過使用java.util.concurrent.atmoic包中的原子變量類AtomicLong來代替long類型來解決該問題是其成為一個線程安全的操作。

在實際情況中,應盡可能地使用現有的線程安全對象(例如AtomicLong)來管理類的狀態,與非線程安全的對象相比,判斷線程安全對象的可能狀態及其狀態轉換情況要更為容器,
從而更容易維護和驗證線程安全性

?加鎖機制

要保值狀態的一致性,就需要在單個原子操作中更新所有相關的狀態變量。

重入意味著獲取鎖的操作的粒度是線程,而不是調用。重入的一種實現方法是,為每個鎖關聯一個獲取計數值和一個所有者線程。

?一種常見的加鎖約定是,將所有的可變狀態都封裝在對象內部,并通過對象的內置鎖對所有訪問可變的代碼路徑進行同步,使得在該對象上不會發生并發訪問。

需要注意的一點是即使是同步方法的符合操作,同樣會導致競態條件問題。如下代碼,雖然vector是的每個方法是原子方法,但是復合操作,同樣會導致出現數據不一致問題。

1 if ( !vector.contains(element)) 2 vector.add(element)

?

遺留問題

1、原子性小節同樣提到了單例的實現,該問題需要統一整理所有單例的實現方法,記一個遺留問題,下周解決

已經復習了單例的相關知識,見:http://www.cnblogs.com/woniu4/p/8287484.html

?

轉載于:https://www.cnblogs.com/woniu4/p/8284244.html

總結

以上是生活随笔為你收集整理的并发编程实战-第二章学习的全部內容,希望文章能夠幫你解決所遇到的問題。

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