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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

深入理解java虚拟机--线程安全与锁优化

發布時間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解java虚拟机--线程安全与锁优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

深入理解java虛擬機--線程安全與鎖優化

    • 面向過程編程思想和面向對象編程思想
    • java語言中的線程安全
    • 線程安全的實現方法
    • 鎖優化

面向過程編程思想和面向對象編程思想

面向過程編程思想:站在計算機的角度,以算法為核心,數據是客體,程序代碼處理數據。
面向對象編程思想:站在現實世界的角度,數據和行為視為對象的一部分。

java語言中的線程安全

5類共享數據類別:1.不可變;2.絕對線程安全;3.相對線程安全;4.線程兼容;5.線程對立。

  • 不可變(final)
    不可變帶來的安全性是最簡單和最純粹的。基本數據類型,final關鍵字修飾;共享數據是一個對象,對象的行為用final修飾。
  • 絕對線程安全
    定義:當多個線程訪問一個對象時,如果不用考慮這些線程在運行時環境下的調度和交替執行,也不需要進行額外的同步,或者在調用方進行任何其他的協調操作,調用這個對象的行為都可以獲得正確的結果,那這個對象是線程安全的。
  • 相對線程安全
    單獨操作是線程安全的;需要額外的同步手段(特定順序的連續調用)。
    例子:Vector的get()、remove()、size()等方法;其他類如:HashTable等。
  • 線程兼容
    本身不是線程安全的;需要正確使用同步手段。
    例子:Vector的get()、remove()、size()等方法;其他類如:ArrayList、HashMap等。
  • 線程對立
    無論是采取何種同步措施,都無法達到線程安全的。
    例子:Thread類的suspend()和resume();其他類如:System類的setInt()、setOut()和runFinalizersOnExit()等。
  • 線程安全的實現方法

    3種實現方法:1.互斥同步;2.非阻塞同步;3.無同步方案。

  • 互斥同步
    也稱阻塞同步;互斥是方法,同步是目的;互斥的實現方式主要有三種:臨界區,互斥量,信號量。實現同步手段:synchronized和ReentrantLock。
    • synchronized:原生語法層面的互斥;關鍵字經過編譯后在同步塊前后形成monitorenter和monitorexit兩個字節碼指令,這兩字字節碼指令都需要一個reference類型的參數來指明要鎖定和解鎖的對象;如果synchronized修飾的實例方法則去取對應的對象實例,如果修飾的是類方法,則去取Class對象所為鎖對象。有兩點要注意的:1.synchronized同步塊對同一條線程來說是可重入的,不會出現自己把自己鎖死的情況;2.同步塊在已進入的線程執行完之前,會阻塞后面其他線程的進入。

    • ReentrantLock:API層面的互斥;相對于synchronized來說有三個高級特性:1.等待可中斷;2.可實現公平鎖;3.鎖可以綁定多個條件;

    • synchronized和ReentrantLock吞吐量比較
      jdk1.5版本:ReentrantLock>synchronized;
      jdk1.6后版本:synchronized、ReentrantLock兩者持平;

    • 處理問題方式角度:互斥同步是悲觀策略。

      阻塞和喚醒一個線程,需要從用戶態轉換到核心態,消耗性能。

  • 非阻塞同步
    • 定義

      基于沖突檢測的樂觀并發策略,先進行操作,如果沒有其他線程的競爭共享數據,那操作就是成功了;如果共享數據有爭用,產生了沖突,那就再采取其他的補充措施(最常見的補償措施就是不斷的重試,直到成功為止),這種樂觀的策略很多實現都不需要把線程掛起。

    • 處理問題方式角度:非阻塞同步是樂觀策略。

    • CAS指令
      內存位置(V)、舊的預期值(A)、新值(B);
      CAS指令執行時,當且僅當V符合舊預期值A時,處理器用新值B更新V的值,否則它就不執行更新,但是無論是否更新了V的值,都會返回V的舊值,上述的處理過程是一個原子操作。

      CAS漏銅,ABA問題:
      如果一個變量V初次讀取的時候是A值,并且在準備賦值的時候檢查到它仍然是A值,那我們就能說它的值沒有被其他線程改變過了嗎?如果在這段期間它的值曾經被改成了B,后來又被改成了A,那CAS操作就會誤認為它從來沒有被改變過。

  • 無同步方案

    2類:1.可重入代碼;2.線程本地存儲。

  • 可重入代碼
    3個特征:不依賴存儲在堆上的數據和公用的系統資源、用到的狀態量都是由參數傳入、不調用非可重入的方法。

  • 線程本地存儲
    例子:生產者-消費者:Web交互模型中的"一個請求對應一個服務器線程"的處理方式。

  • 鎖優化

    5種鎖優化:1.自旋鎖和自適應自旋;2.鎖消除;3.鎖粗化;4.輕量級鎖;5.偏向鎖。

  • 自旋鎖和自適應自旋
    • 自旋鎖定義
      是指嘗試獲取鎖的線程不會立即阻塞,而是采用循環的方式去嘗試獲取鎖。
    • 自適應自旋定義
      • 自旋的時間不在固定,由前一次在同一個鎖上的自旋時間及鎖的擁有者的狀態決定。
    • 原因
      • 掛起線程和喚醒線程會消耗處理器時間
      • 共享數據的鎖定狀態很多情況只會持續很短的時間
  • 鎖消除
    • 定義
      指在虛擬機即時編譯器在運行時,對一些代碼上要求同步,但是被檢測到不可能存在共享數據競爭的鎖進行消除。
  • 鎖粗化
    范圍擴大,如果虛擬機探測到有這樣的一串零碎的操作都是對同一個對象加鎖,將會把加鎖同步的范圍擴展(粗化)到整個操作序列的外部,這樣只需要加鎖一次就可以了。

  • 輕量級鎖

    • 沒有多線程的競爭前提下;減少傳統的重量級所使用操作系統互斥量產生的性能消耗。
    • Mark Word
  • 偏向鎖
    • 消除數據在無競爭情況下的同步原語,進一步提高程序的運行性能。
    • 不用做CAS操作。

    總結

    以上是生活随笔為你收集整理的深入理解java虚拟机--线程安全与锁优化的全部內容,希望文章能夠幫你解決所遇到的問題。

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