日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java ReentrantLock 锁相关笔记

發(fā)布時(shí)間:2023/12/6 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java ReentrantLock 锁相关笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??

ReentrantLock重入鎖簡單理解就是對同一個(gè)線程而言,它可以重復(fù)的獲取鎖。例如這個(gè)線程可以連續(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ī)制,開啟幾個(gè)線程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;}//寫一個(gè)方法用來喚醒線程@RequestMapping("/thread/signal")public void signal() {lock.lock();condition.signal();lock.unlock();System.out.println("線程已被喚醒");}//寫一個(gè)方法用來多線程調(diào)用public void thread() throws Exception {//寫個(gè)循環(huán)用來多線程干擾for (int i = 0; i < 5; i++) {System.out.println("線程" + i + ":" + Thread.currentThread().getName());//得稍微耗時(shí)一下才行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&amp;idx=1&amp;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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。