Java多執行緒的悲觀鎖與樂觀鎖
首先介紹一些樂觀鎖與悲觀鎖:
悲觀鎖:總是假設最壞的情況,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會阻塞直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。再比如Java裡面的同步原語synchronized關鍵字的實現也是悲觀鎖。
樂觀鎖:顧名思義,就是很樂觀,每次去拿資料的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個資料,可以使用版本號等機制。樂觀鎖適用於多讀的應用型別,這樣可以提高吞吐量,像資料庫提供的類似於write_condition機制,其實都是提供的樂觀鎖。在Java中java.util.concurrent.atomic包下面的
簡而言之:
悲觀鎖:假定會發生併發衝突,遮蔽一切可能違反資料完整性的操作。樂觀鎖:假設不會發生併發衝突,只在提交操作時檢查是否違反資料完整性。 樂觀鎖不能解決髒讀的問題。
相關推薦
java多執行緒----悲觀鎖與樂觀鎖
java多執行緒中悲觀鎖與樂觀鎖思想 一、悲觀鎖 總是假設最壞的情況,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會阻塞直到它拿到鎖(共享資源每次只給一個執行緒使用,其它執行緒阻塞,用完後再把資源轉讓給其它執行緒)。傳統的關係型資料庫裡邊就用到了很
java多執行緒8.效能與活躍性問題
死鎖——鎖順序死鎖 兩個執行緒試圖以不同的順序來獲得相同的鎖。如果按照相同的順序來請求鎖,那麼就不會出現迴圈的加鎖依賴,因此也就不會產生死鎖。 public class LeftRightDeadlock { private final Object left = new Object();
java多執行緒之Lock--顯式鎖
Lock與Synchronized簡介 Synchornized相信大家用的已經比較熟悉了,這裡我就不介紹它的用法了 Synchronized被稱為同步鎖或者是隱式鎖,隱式鎖與顯式鎖區別在於,隱式鎖的獲取和釋放都需要出現在一個塊結構中,而且是有順序的,獲取鎖的順序和釋放鎖的順序必須相反,就是說,
Java多執行緒下載原理與實現
多執行緒下載原理 客戶端要下載一個檔案, 首先請求伺服器,伺服器將這個檔案傳送給客戶端,客戶端儲存到本地, 完成了一個下載的過程. 多執行緒下載的思想是客戶端開啟多個執行緒同時下載,每個執行緒只負責下載檔案的一部分, 當所有執行緒下載完成的時候,檔案下載完畢.
java多執行緒之(二)鎖
一,鎖 在物件的建立時java會為每個object物件分配一個monitor( 監視器或者監視鎖),當某個物件的同步方法(synchronized methods )被多個執行緒呼叫時,該物件的monitor將負責處理這些訪問的併發獨佔要求。 當一個執行緒呼叫一個物件的同步方法時(sy
java多執行緒容器ConcurrentMap與CopyOnWrite
一、ConcurrentMap介面下有兩個重要的實現: ConCurrentHashMap ConcurrentSkipListMap(支援併發排序功能,彌補ConcurrentHashMap) ConcurrentHashMap內部使用段(Segment)來表示這些不同的部分,每個段其
JAVA多執行緒之volatile 與 synchronized 的比較
一,volatile關鍵字的可見性 要想理解volatile關鍵字,得先了解下JAVA的記憶體模型,Java記憶體模型的抽象示意圖如下: 從圖中可以看出: ①每個執行緒都有一個自己的本地記憶體空間--執行緒棧空間???執行緒執行時,先把變數從主記憶體讀取到執行緒自己
java多執行緒程式設計之讀寫鎖設計高效能快取器
解決多執行緒執行緒安全問題的主要方法是通過加鎖的方式來實現,當多個執行緒對某個變數進行讀取或寫入的時候通過加鎖來限定只有當前獲取鎖許可權的執行緒才可以對資料進行讀寫,當該執行緒訪問完畢釋放鎖之後其他阻
入坑JAVA多執行緒併發(六)死鎖
在多執行緒的中,因為要保證執行緒安全,需要對一些操作進行加鎖,但是如果操作不當,會造成死鎖,導致程式無法執行下去。 形成死鎖的場景:如果有兩個執行緒,執行緒1和執行緒2,執行緒1執行,獲得鎖A,執行緒2執行,獲得B,執行緒1等待鎖B的釋放,執行緒2等待
Java多執行緒--重排序與順序一致性
前言 在我們編寫程式並執行的時候,編譯器給我們一個錯覺:程式編譯的順序與編寫的順序是一致的。但是實際上,為了提高效能,編譯器和處理器常常會對指令進行重排序。重排序主要分為兩類:編譯器優化的重排序、指令級別並行的重排序和記憶體系統的重排序。所以我們編寫好Java原始碼之後
Java多執行緒-53-ReentrantLock類-互斥鎖
前面文章末尾,我們提到wait會釋放鎖,而sleep不會釋放鎖。那麼什麼是鎖,鎖就是把執行緒鎖住。也就是執行緒能被鎖住,當然還有釋放鎖。這篇來了解下ReentrantLock類,中文的意思就是互斥鎖。主要學習這個類的lock()獲取鎖和unlock()釋放鎖。 互斥鎖程式碼舉例 我們先來
Java 多執行緒的生產與銷售應用
生產與消費多執行緒程式, 編寫電影院生產10個電影,一邊生產(播放)一邊消費(觀看)。 如圖效果: 共享資源:電影 class Movie { private String name; // 訊號燈 // flag=true 生
JAVA多執行緒之Synchronized關鍵字--物件鎖的特點
一,介紹 本文介紹JAVA多執行緒中的synchronized關鍵字作為物件鎖的一些知識點。 所謂物件鎖,就是就是synchronized 給某個物件 加鎖。關於 物件鎖 可參考:這篇文章 二,分析 synchronized可以修飾例項方法,如下形式: 1 public class My
java多執行緒之synchronized與lock、wait與notify
class Res { public String name; public String sex; public Boolean flag = false; public Lock lock = new ReentrantLock(); Condition condition = lock.new
js單執行緒與java多執行緒、同步與非同步
寫這篇部落格源於想對比一下單執行緒js和多執行緒java兩種語言的區別。 定義區: 單執行緒:只能執行一個任務,只有在完成執行後,才能繼續執行其他的任務。 多執行緒:有多個執行緒,可以同時執行多個任務。
Java多執行緒之狀態與生命週期
執行緒的生命週期 執行緒建立並啟動後,不是一啟動就進入執行狀態,也不會一直處於執行狀態。 執行緒啟動後不可能一直霸佔CPU,所以CPU會在多執行緒之間切換,於是執行緒狀態也會多次在執行、阻塞之間切換 線上程的生命週期中,執行緒共有5種狀態,在任意時刻,執行
【Java多執行緒】synchronized與執行緒安全
介紹 修飾方法:一個執行緒去呼叫一個加synchronized的方法的時候,會獲得該物件的 物件鎖。 修飾靜態方法:一個執行緒去呼叫一個既加static,又加synchronized的方法的時候,會獲得該物件的 類鎖。 修飾程式碼塊: ①加物件鎖:
Java多執行緒1:程序與執行緒
1.什麼是程序? 程序是作業系統結構的基礎,是一次程式的執行,是系統進行資源分配和排程的一個獨立單位。 這個解釋有點懵了。簡單來講就是一個正在作業系統中的執行的exe程式就是一個程序。 2.什麼是執行緒? 執行緒可以理解為是在程序中獨立執行的子任務。
Java多執行緒中的物件互斥鎖
1、為什麼會有鎖? 在看執行緒同步的問題之前,我們先看一個生活中的小例子: 我拿著銀行卡去ATM取錢,假如我的卡里有3000塊,我要取走2000,這個時候,ATM會去銀行的資料庫裡查詢我的賬戶是否有2000以上的餘額,如果有,就會讓我取走,不幸的是,這個時候
Java多執行緒Runnable介面與Thread類,以及synchronied關鍵字
Java多執行緒實現有兩種方式一個是實現Runnable介面一個是繼承Thread類 如果只是為了實現Thread的執行過程,那麼沒有必要從Thread中派生,因為是是實現Runnable介面的物件代表的是一個計算任務,Thread類對應任務的執行者。 如果執行緒類繼承Th