在java鎖的知識中,我們首先要知道分布式鎖和本地鎖的概念,
1、本地鎖:
在單行程的系統中,存在多個執行緒去同時操作某個共享變數時,就需要使用本地鎖,最常用的關鍵字:synchronized
2、分布式鎖:
在分布式系統中,我們知道會有多臺服務器同時部署一個大專案,這樣就是多行程對應的多執行緒問題,分布式情況下(多jvm),執行緒A和執行緒B很可能不在同一JVM中,這樣本地鎖無法解決問題,這個時候分布式鎖就出現了,
常用技術方案:目前作者已經使用過Redis+Lua腳本、使用redis中setnx指令、使用redis自帶成熟的框架Redisson框架去解決分布式鎖問題,
3、本地鎖應用之單例模式之懶漢單例模式
在引入鎖之前我們先來看一個單例設計模式之懶漢單例模式:
package task4;
public class LazySingle {
private static LazySingle instance = null;
private LazySingle() {
System.out.println("建構式");
}
public static LazySingle getInstance() {
if(null == instance) {
instance = new LazySingle();
}
return instance;
}
}
class TestLazy {
public static void main(String[] args) {
LazySingle instance1 = LazySingle.getInstance();
LazySingle instance2 = LazySingle.getInstance();
System.out.println(instance1 == instance2);
}
}
運行結果:

直接學習上面代碼我們發現這個代碼是執行緒不安全的,原因是兩步操作(先取值,在賦值),不具備原子性,
當多個執行緒訪問這個方法時,必定會創建多個物件,這樣這個代碼就不是單例的,

那么直接加一個本地鎖:synchronized不就可以么,確實是這樣的,代碼變得執行緒安全了,但是這是一個悲觀鎖,創建物件對策效率就會變的奇低,

怎么辦呢?我們在仔細學習代碼發現:return instance;這是一個原子性的操作,問題其實就是出在if(null == instance ) { instance == new LazySingle(); } 這明顯就是一個先取值判斷在賦值的程序,不是一個執行緒安全的,
在單例模式中,我們只需要創建一個物件,那么我們發現一開始物件不存在的時候一定會走if(null == instance ) {}
當多執行緒訪問的時候就會有漏網之魚進入這個代碼塊,所以我們發現只有第一次創建物件的時候是執行緒不安全的,其余后面n次獲取物件都是安全的,都是直接return,
好?那怎么解決這個問題?采用雙重判斷加synchronized鎖解決問題,

只鎖第一次,后面的n次不鎖,很妙,完美解決效率問題,也實作了單例模式,
4、分布式鎖
分布式鎖其實本質是一樣的,只是因為分布式系統中,代碼運行在多臺機器,本地鎖鎖不住了,只能用分布式鎖,
由于時間原因,后面有時間會單獨出一篇文章來應用分布式鎖----以秒殺案例中的超買超賣問題和redis的快取穿透為例子進行說明,
好啦,謝謝大家閱讀,萌新文本不好哈,希望大家共同加油,把java從入門到入墳,走上人生巔峰,哈哈~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297422.html
標籤:其他
上一篇:檔案管理基礎命令之一實驗
下一篇:vulnhub DC8 靶場練習
