P8实战(四):多种分布式锁实现
生活随笔
收集整理的這篇文章主要介紹了
P8实战(四):多种分布式锁实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
分布式鎖
1、什么是鎖?
2、鎖解決什么問題?
3、單機版的鎖怎么實現的?
synchronized
- wait
- notify
ReentrantLock
- lock
- unlock
操作系統層面
- 公平鎖:管程ReentrantLock(就是AQS);AtomicInteger沒有管程,里面是自旋鎖
- 非公平鎖
4、分布式鎖怎么實現的?
- OSI 是概念性的模型,實際上是 TCP / IP 四層協議
- 多機版分布式鎖 = 單機版的線程同步模型 + ICP / IP 協議棧
- 總線協議(例如 lock cmpxchg) + 數據,管程 = 單機版鎖
什么?你不知道lock cmpxchg?
來,看一下 Unsafe.java 類的源碼:
這是在 package sun.misc; 包下,JDK1.8 的 OpenJDK 的源碼
這里面的 getAndAddInt() 方法的實現,調用了 compareAndSwapInt() 方法,這是一個 native 方法
/*** Atomically update Java variable to <tt>x</tt> if it is currently* holding <tt>expected</tt>.* @return <tt>true</tt> if successful*/public final native boolean compareAndSwapInt(Object o, long offset,int expected,int x);在 HotSpot 源碼中是 C++ 的
內聯匯編:
cmp $0, " #mp "; je 1f; lock; 1:- lock 是鎖總線
- 狀態寄存器
位置:
openjdk-8-src-b132-03_mar_2014\openjdk\hotspot\src\os_cpu\linux_x86\vm\atomic_linux_x86.inline.hpp // Adding a lock prefix to an instruction on MP machine #define LOCK_IF_MP(mp) "cmp $0, " #mp "; je 1f; lock; 1: "inline jint Atomic::add (jint add_value, volatile jint* dest) {jint addend = add_value;int mp = os::is_MP();__asm__ volatile ( LOCK_IF_MP(%3) "xaddl %0,(%2)": "=r" (addend): "0" (addend), "r" (dest), "r" (mp): "cc", "memory");return addend + add_value; }分布式鎖的實現
基于 Redission 對 Redis 分布式鎖的實現:
在 Redission 源碼中,是使用 lua 腳本 + redis 實現鎖重入:
總結
以上是生活随笔為你收集整理的P8实战(四):多种分布式锁实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 响应式web(四):使用Netty作为w
- 下一篇: DevOps运维开发一体化 - 公开课笔