JUC的安全并發包機制

目錄

1. Lock機制:明鎖控制

2. 柵欄機制(CyclicBarrier)

3. 閉鎖機制(CountDownLatch)

4. 信號量機制(Semaphore)

5. 無鎖機制


1. Lock機制:明鎖控制

????????Lock接口提供了比synchronized更靈活的鎖機制,屬于明鎖(需要手動獲取和釋放鎖)。與synchronized隱式鎖不同,Lock需要顯式地調用lock()和unlock()方法。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class LockDemo {private Lock lock = new ReentrantLock();private int count = 0;public void increment() {lock.lock();  // 手動獲取鎖try {count++;} finally {lock.unlock();  // 必須在finally中手動釋放鎖}}
}

2. 柵欄機制(CyclicBarrier)

????????柵欄機制允許一組線程相互等待,直到所有線程都到達某個屏障點,然后所有線程才會繼續執行。CyclicBarrier可以重復使用,適用于分階段的任務處理。

package com.demo5;import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;/*** * 研學,旅游公司包車,一個車做4個同學,坐滿就發車; 總共有28個人,怎么控制和實現?**/public class Test {public static void main(String[] args) {// 設置屏障點CyclicBarrier cb = new CyclicBarrier(4, () -> {System.out.println("已經有4個同學了,就發車吧, 旅游車已經啟動出發");});for (int i = 0; i < 28; i++) {Runnable r = () -> {System.out.println("學生來報道............");try {cb.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (BrokenBarrierException e) {// TODO Auto-generated catch blocke.printStackTrace();}};try {Thread.sleep(3000);} catch (InterruptedException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}new Thread(r).start();}}}

運行結果:

3. 閉鎖機制(CountDownLatch)

????????閉鎖是一種一次性使用的同步輔助工具,允許一個或多個線程等待其他線程完成操作。

package com.demo8;import java.util.concurrent.CountDownLatch;public class Test {public static void main(String[] args) {//閉鎖,任務只能執行一次CountDownLatch cdl   = new CountDownLatch(10);//10個人到了,一桌人開始吃飯,吃完就結束。for(int i=0;i<10;i++){Runnable  r = ()->{System.out.println(Thread.currentThread().getName()+",來吃飯.....");cdl.countDown();//-1,一直到0};try {Thread.sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}new Thread(r).start();}try {cdl.await(); // 等待計數器歸零,屏障點解除} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("我們開始歡樂的用餐");}}

運行結果:

4. 信號量機制(Semaphore)

????????信號量用于控制同時訪問特定資源的線程數量,通過許可證機制實現資源池的訪問控制。

package com.demo9;import java.util.Random;
import java.util.concurrent.Semaphore;public class Test {public static void main(String[] args) {Semaphore  s  = new Semaphore(3);   // 允許3個線程同時訪問for(int i=0;i<6;i++){Runnable  r = ()->{try {s.acquire();  // 獲取許可System.out.println(Thread.currentThread().getName()+", 搶優惠劵");Thread.sleep(new Random().nextInt(20)*1000);System.out.println(Thread.currentThread().getName()+", 離開現場");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{s.release();  // 釋放許可}};new Thread(r).start();}}}

運行結果:

5. 無鎖機制

????????無鎖編程通過CAS(Compare And Swap)操作實現線程安全,避免了鎖的開銷。Java中的Atomic類就是無鎖機制的典型實現。

package com.demo3;import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;public class Test {// 原子鎖,就是無鎖private  static  AtomicInteger  count  = new AtomicInteger(0);public static void inc() {try {Thread.sleep(1);// 毫秒count.getAndIncrement();//count加1// TimeUnit.MILLISECONDS.sleep(1);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {CountDownLatch cd = new CountDownLatch(100);for (int i = 0; i < 100; i++) {Runnable r = () -> {Test.inc();cd.countDown();};new Thread(r).start();}try {cd.await();System.out.println("總和為:" + Test.count);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

運行結果:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95431.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95431.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95431.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開源企業級快速開發平臺(JeecgBoot)

JeecgBoot 是一款基于 Spring Boot Vue 技術棧的開源企業級快速開發平臺&#xff0c;旨在通過「低代碼代碼生成」模式降低企業級應用的開發成本&#xff0c;提升開發效率。其核心定位是“開箱即用的中后臺解決方案”&#xff0c;覆蓋權限管理、表單報表、工作流、代碼生成等核…

探索 PostgreSQL 和 MySQL 之間的主要差異和相似之處,找到滿足您項目需求的最佳數據庫解決方案。

探索 PostgreSQL 和 MySQL 之間的主要差異和相似之處&#xff0c;找到滿足您項目需求的最佳數據庫解決方案。 探索 PostgreSQL 和 MySQL 之間的主要差異和相似之處&#xff0c;找到滿足您項目需求的最佳數據庫解決方案。 關系數據庫已經存在了很長時間。事實上&#xff0c;關系…

如何畫時序圖、流程圖、狀態流轉圖

如何畫時序圖、流程圖、狀態流轉圖流程圖符號約定時序圖元素交互框最佳實踐狀態流轉圖在研發或者寫技術方案的時候&#xff0c;我們經常會畫各種圖。圖比文字更加容易理解一些&#xff0c;那么如何畫出優秀好看的圖呢下面簡單介紹一些畫圖時需要注意的點 流程圖 流程圖是流程…

CSDN 與 掘金 高效學習指南

CSDN 和掘金&#xff08;juejin.cn&#xff09;是國內最活躍的技術社區&#xff0c;但信息量巨大、質量參差不齊。高效運用的關鍵是&#xff1a;從“被動瀏覽”轉向“主動獲取”&#xff0c;避免陷入“收藏一堆文章卻學不會”的陷阱。 以下是為你量身定制的CSDN 與 掘金 高效學…

容器tomcat鏡像制作

pull-tomcat鏡像 docker pull tomcat啟動 –security-opt 禁用默認的安全策略&#xff0c;放寬限制 docker run -d --name mysql-tomcat -p 8080:8080 --security-opt seccompunconfined tomcat:latest進入容器直接訪問404&#xff0c;網頁相關的webapps下面為空&#xff0c;將…

AC安全認證方式全解析

AC的幾種安全認證方法認證方式 安全性 便捷性 典型應用場景 所需配置Portal認證 ??中 高 訪客網絡、商場、 Portal服務 酒…

《壘球江西百科》男子壘球世界紀錄·壘球9號位

男子壘球世界紀錄終極盤點? | 冷知識科普&#xff01;1. 最遠本壘打距離 | Longest Home Run Distance紀錄保持者&#xff1a; Jeff Hall (美國)距離&#xff1a; 643英尺 (約196米)賽事&#xff1a; 2012年 USSSA 慢投壘球錦標賽? 科普&#xff1a; 慢投壘球中&#xff0c;球…

設計模式六大原則2-里氏替換原則

肯定有不少人跟我剛看到這項原則的時候一樣&#xff0c;對這個原則的名字充滿疑惑。其實原因就是這項原則最早是在1988年&#xff0c;由麻省理工學院的一位姓里的女士&#xff08;Barbara Liskov&#xff09;提出來的。定義1&#xff1a;如果對每一個類型為 T1的對象 o1&#x…

Spring Security 深度學習(五): 過濾器鏈與自定義過濾器

目錄1. 引言&#xff1a;揭開Spring Security的內部奧秘2. Spring Security 過濾器鏈核心機制2.1 DelegatingFilterProxy&#xff1a;整合Spring與Servlet容器2.2 FilterChainProxy&#xff1a;管理安全過濾器鏈的“總管”2.3 Security Filters&#xff1a;核心安全功能的承載者…

微軟GraphRAG 端到端使用及自用工具類

文章目錄一. 環境準備1.安裝 Python 環境2.安裝依賴3.配置 LLM API Key二. 初始化項目三. 文檔上傳 & 索引構建四. 問答&#xff08;CLI 方式&#xff09;示例&#xff1a;五. 代碼中調用 GraphRAG工具概覽核心工具詳解1. simple_graphrag_integration.py - 智能問答核心2.…

sqlserver2008導入excel表數據遇到的問題

1.如果表格為.xlsx格式時可能會提示“沒有為此鏈接管理提供列”&#xff0c;無法點擊下一步的話&#xff0c;建議可以使用.csv格式 .csv格式可能也會存在此提示&#xff0c;但是可以不用管 2.導入.csv數據時&#xff0c;字段為int時&#xff0c;填null導入不進去的話可以給個0作…

Unity游戲打包——打包流程

本文由 NRatel 歷史筆記整理而來&#xff0c;如有錯誤歡迎指正。一、基本流程二、組合步驟把上述每步做成獨立的輸入輸出邏輯 y fuc(x)然后&#xff0c;控制/組合其過程&#xff0c;可靈活產生不同的流程&#xff1a;1、單渠道出測試包2、單渠道出正式包3、單渠道包熱更三、構…

卷積神經網絡(二):手寫數字識別項目(一)

文章目錄手寫數字識別項目一、準備數據集二、定義模型三、模型訓練3.1 導入依賴庫3.2 設備設置&#xff08;CPU/GPU 自動選擇&#xff09;3.3 超參數定義3.4數據集準備1.獲取數據集2.劃分訓練集與驗證集3.創建 DataLoader&#xff08;按批次加載數據&#xff09;3.5模型初始化與…

批量給文件夾添加文件v2【件批量復制工具】

代碼功能介紹 這個代碼的功能就是一個&#xff0c;給某個文件夾里面添加某個文件&#xff08;含父級文件夾下的每一個子文件夾&#xff09; 舉個例子&#xff0c;父級文件夾是&#xff1a;“D:\Desktop\1&#xff0c;要添加的文件路徑是&#xff1a;D:\1.txt” 則最后會把文件…

Qt實現2048小游戲:看看AI如何評估棋盤策略實現“人機合一

2048 是一款經典的數字益智游戲,其簡單的規則背后蘊含著豐富的策略性。該項目不僅完整實現了 2048 的核心玩法,還包含了一個基于啟發式評估和蒙特卡洛方法的智能 AI 玩家。 我們將從項目整體架構入手,逐一解析游戲核心邏輯、UI 渲染、事件處理、AI 策略等關鍵模塊,并通過展…

封裝紅黑樹實現mysetmymap

1. 源碼分析 set實例化rb_tree時第二個模板參數給的是key&#xff0c;map實例化rb_tree時第?個模板參數給的是 pair<const key,T>&#xff0c;這樣一顆紅黑樹既可以實現key搜索場景的set&#xff0c;也可以實現key/value搜索場 景的map源碼里面模板參數是用T代表value&…

以OWTB為核心以客戶為基礎的三方倉運配一體化平臺分析V0.2

一、系統概述以OWTB&#xff08;Order-Warehouse-Transportation-Billing&#xff0c;訂單-倉儲-運輸-結算&#xff09;為核心的三方倉運配一體化平臺&#xff0c;是專為第三方物流企業打造的深度定制化解決方案。該平臺以第三方倉運配為主線&#xff0c;以多客戶/多SKU/個性化…

技術框架之腳手架實現

一、 序言在日常的企業級Java開發中&#xff0c;我們經常會發現自己在重復地做著一些項目初始化工作&#xff1a;創建相似的項目結構、引入一堆固定的依賴包、編寫通用的配置文件、拷貝那些幾乎每個項目都有的基礎工具類和日志配置。這些工作不僅枯燥乏味&#xff0c;而且容易出…

小迪安全v2023學習筆記(七十七講)—— 業務設計篇隱私合規檢測重定向漏洞資源拒絕服務

文章目錄前記WEB攻防——第七十七天業務設計篇&隱私合規檢測&URL重定向&資源拒絕服務&配合項目隱私合規 - 判斷規則&檢測項目介紹案例演示URL重定向 - 檢測判斷&釣魚配合介紹黑盒測試看業務功能看參數名goole語法搜索白盒測試跳轉URL繞過思路釣魚配合資…

用AI做旅游攻略,真能比人肉整理靠譜?

大家好&#xff0c;我是極客團長&#xff01; 作為一個沉迷研究 “AI 工具怎么滲透日常生活” 的科技博主&#xff0c;我開了個 AI 解決生活小事系列。 前兩期聊了用 AI 寫新聞博客、扒商業報告&#xff0c;后臺一堆人催更&#xff1a;能不能搞點接地氣的&#xff1f;比如&am…