java ReentrantLock 锁相关笔记
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
ReentrantLock重入鎖簡單理解就是對同一個線程而言,它可以重復(fù)的獲取鎖。例如這個線程可以連續(xù)獲取兩次鎖,但是釋放鎖的次數(shù)也一定要是兩次
Lock lock=new ReentrantLock(true);//公平鎖
Lock lock=new ReentrantLock(false);//非公平鎖
公平鎖指的是線程獲取鎖的順序是按照加鎖順序來的,而非公平鎖指的是搶鎖機(jī)制,先lock的線程不一定先獲得鎖。Java的synchronized關(guān)鍵字就是非公平鎖
?
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();//設(shè)置程序進(jìn)入等待狀態(tài)private Condition condition = lock.newCondition();@RequestMapping("thread")public int test() {//練習(xí)鎖機(jī)制,開啟幾個線程for (int i = 0; i < 5; i++) {new Thread(() -> {try {lock.lock();//此處測試線程等待和線程喚醒System.out.println("線程進(jìn)入等待狀態(tài)");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("線程已被喚醒");}//寫一個方法用來多線程調(diào)用public void thread() throws Exception {//寫個循環(huán)用來多線程干擾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會和實(shí)際值對比,如果相同則更新成next值,否則繼續(xù)循環(huán)。
public final int incrementAndGet() {for (; ; ) {//獲取當(dāng)前值int current = get();//設(shè)置期望值int next = current + 1;//調(diào)用Native方法compareAndSet,執(zhí)行CAS操作if (compareAndSet(current, next))//成功后才會返回期望值,否則無線循環(huán)return next;} }?
講解自旋鎖等相關(guān)知識:
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
轉(zhuǎn)載于:https://my.oschina.net/uwith/blog/3045525
總結(jié)
以上是生活随笔為你收集整理的java ReentrantLock 锁相关笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 面试知识点笔记(七)RR如何
- 下一篇: 第五章 了解你的用户