為什么80%的碼農都做不了架構師?>>> ??
ReentrantLock重入鎖簡單理解就是對同一個線程而言,它可以重復的獲取鎖。例如這個線程可以連續獲取兩次鎖,但是釋放鎖的次數也一定要是兩次
Lock lock=new ReentrantLock(true);//公平鎖
Lock lock=new ReentrantLock(false);//非公平鎖
公平鎖指的是線程獲取鎖的順序是按照加鎖順序來的,而非公平鎖指的是搶鎖機制,先lock的線程不一定先獲得鎖。Java的synchronized關鍵字就是非公平鎖
?
package com.example.web.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock;@RestController public class ThreadController {//測試每次請求是否重新初始化int single = 0;private ReentrantLock lock = new ReentrantLock();private ReentrantReadWriteLock lockRW = new ReentrantReadWriteLock();//設置程序進入等待狀態private Condition condition = lock.newCondition();@RequestMapping("thread")public int test() {//練習鎖機制,開啟幾個線程for (int i = 0; i < 5; i++) {new Thread(() -> {try {lock.lock();//此處測試線程等待和線程喚醒System.out.println("線程進入等待狀態");condition.await();thread();} catch (Exception ex) {} finally {lock.unlock();}}).start();}single++;System.out.println(single);return single;}//寫一個方法用來喚醒線程@RequestMapping("/thread/signal")public void signal() {lock.lock();condition.signal();lock.unlock();System.out.println("線程已被喚醒");}//寫一個方法用來多線程調用public void thread() throws Exception {//寫個循環用來多線程干擾for (int i = 0; i < 5; i++) {System.out.println("線程" + i + ":" + Thread.currentThread().getName());//得稍微耗時一下才行Thread.sleep(50);}}}
private ReentrantReadWriteLock lockRW = new ReentrantReadWriteLock();//讀寫鎖
Lock類有讀鎖和寫鎖,讀讀共享,寫寫互斥,讀寫互斥
?
參考鏈接:https://www.cnblogs.com/-new/p/7256297.html
?
java原子類使用的就是原子鎖,核心方法就是compareAndSet,也就是常說的CAS,用來對比更新,寫一段偽代碼,current會和實際值對比,如果相同則更新成next值,否則繼續循環。
public final int incrementAndGet() {for (; ; ) {//獲取當前值int current = get();//設置期望值int next = current + 1;//調用Native方法compareAndSet,執行CAS操作if (compareAndSet(current, next))//成功后才會返回期望值,否則無線循環return next;} }
?
講解自旋鎖等相關知識:
https://blog.csdn.net/qq_34337272/article/details/81252853
https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484911&idx=1&sn=1d53616437f50b353e33edad6fda2e4f&source=41#wechat_redirect
各種鎖介紹:https://www.cnblogs.com/lzh-blogs/p/7477157.html