JUC包(面試常問)

1. Callable接口

類似于Runnable接口,Runnable描述的任務,不帶返回值;Callable描述的任務帶返回值。

public class Test {//創建線程,計算1+2+...+1000public static void main(String[] args) throws ExecutionException, InterruptedException {//使用Callable定義一個任務Callable<Integer> callable = new Callable<Integer>() {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 1; i <= 1000; i++) {sum += i;}return sum;}};//類似于憑小票取餐,這是獲取結果的憑證FutureTask<Integer> futureTask = new FutureTask<>(callable);//Thread構造方法不能直接傳callable,需要借助futureTaskThread t = new Thread(futureTask);t.start();//獲取線程計算結果//get方法會阻塞等待直到call方法計算完畢,get才會返回System.out.println(futureTask.get());}
}

2. ReentrantLock

和synchronized一樣是可重入鎖,但是兩者又有些不同,可以說reentrantLock是對synchronized的補充。
核心方法

  1. lock()加鎖
  2. unlock()解鎖
  3. tryLock()嘗試加鎖
和synchronized相比的缺點

進入synchronized內自動加鎖,出了synchronized自動解鎖。而reentrantLock需要手動加鎖,解鎖。這就可能出現解鎖失敗

public static void main(String[] args) {ReentrantLock locker = new ReentrantLock();locker.lock();if(true) {return;}locker.unlock();
}

上面代碼直接return沒有執行unlock()方法,解決方法就是使用try finally

public static void main(String[] args) {ReentrantLock locker = new ReentrantLock();try {locker.lock();if(true) {return;}} finally {locker.unlock();}
}

和synchronized相比的優點
  1. tryLock嘗試加鎖,可以設置加鎖等待時間。而synchronized采用的是“死等策略”,死等需要慎重。
  2. ReentrantLock可以實現成公平鎖,默認是非公平鎖
ReentrantLock locker = new ReentrantLock(true);
  1. synchronized是搭配wait/notify實現等待通知機制,隨機喚醒一個等待的線程。ReentrantLock是搭配Condition類實現,可以指定喚醒哪個等待的線程。(實例化多個Condition對象,使用await/signal方法)
面試題:談談兩者的區別

上面的優點+缺點
補充:synchronized是java關鍵字,底層是JVM實現的;而ReentrantLock是標準庫的一個類,底層基于java實現的

3.原子類

原子類的底層是基于CAS實現的,使用原子類,最常見的場景是多線程計數。例如求服務器有多少并發量。

4.信號量Semaphore

信號量相當于一個計數器,表示可用資源的個數。
信號量的基本操作:

  1. P操作,申請一個資源
  2. V操作,釋放一個資源

當計數為0的時候,繼續P操作,就會阻塞等待到其他線程V操作。
信號量可用視為一個廣義的鎖,而鎖相當于一個可用資源為1的信號量。

public static void main(String[] args) throws InterruptedException {//3個可用資源的信號量Semaphore semaphore = new Semaphore(3);//P操作,申請一個資源semaphore.acquire();System.out.println("p操作");//V操作釋放一個資源semaphore.release();System.out.println("V操作");semaphore.acquire();System.out.println("p操作1");semaphore.acquire();System.out.println("p操作2");semaphore.acquire();System.out.println("p操作3");semaphore.acquire();System.out.println("p操作4");}

image.png
發現“p操作4”沒有打印,可用資源只有3,前面已經申請3次了,所以沒打印,只能阻塞等待到釋放資源。

5.CountDownLatch

直譯過來就是“計數關閉門閥”,很難理解對吧?舉個例子馬上讓你通透。
5名選手進行百米比賽的時候,當最后一個選手撞線比賽才結束。使用CountDownLatch也是類似,每個選手撞線的時候,就調用countDown方法,當撞線次數達到選手個數,就認為比賽結束。
在舉個例子,使用多線程下載一個很大的文件,就切分成多個部分,每個線程負責下載一個部分,當一個線程下載完畢,就調用countDown方法,當所有線程都下載完畢,整個文件就下載完畢。

public static void main(String[] args) throws InterruptedException {//10個選手參加比賽CountDownLatch countDownLatch = new CountDownLatch(5);//創建10個線程來執行任務for (int i = 0; i < 5; i++) {Thread t = new Thread(() -> {System.out.println("選手出發" + Thread.currentThread().getName());try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("選手到達" + Thread.currentThread().getName());//選手撞線countDownLatch.countDown();});t.start();}//阻塞等待,直到所有選手都撞線,才能解除阻塞countDownLatch.await();System.out.println("比賽結束");
}

image.png

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

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

相關文章

js/jQuery常見操作 之各種語法例子(包括jQuery中常見的與索引相關的選擇器)

js/jQuery常見操作 之各種語法例子&#xff08;包括jQuery中常見的與索引相關的選擇器&#xff09; 1. 操作table常見的1.1 動態給table添加title&#xff08;指定td&#xff09;1.1.1 給td動態添加title&#xff08;含&#xff1a;獲取tr的第幾個td&#xff09;1.1.2 動態加工…

KWin、libdrm、DRM從上到下全過程 —— drmModeAddFBxxx(23)

接前一篇文章:KWin、libdrm、DRM從上到下全過程 —— drmModeAddFBxxx(22) 上一回講解了i915_gem_object_lookup_rcu函數的第1個參數struct drm_file *file,本回講解其第2個參數u32 handle。 (2)參數u32 handle 說起來,handle要比struct drm_file *file參數好理解多了…

怎么更改android的包名,使其可以變成另外一個app

在 Android 中更改應用的包名并不是一項簡單的任務&#xff0c;因為包名在應用的整個代碼和配置文件中都被廣泛使用。但是&#xff0c;你可以通過以下步驟來更改應用的包名&#xff1a; 注意&#xff1a;在更改包名之前&#xff0c;請確保備份你的項目&#xff0c;以防發生意外…

thinkphp 結合swoole 聊天開發實例

好的&#xff0c;下面我為您介紹使用ThinkPHP和Swoole開發聊天應用的實例。 環境搭建 首先需要安裝PHP和Swoole擴展&#xff0c;可以使用以下命令&#xff1a; yum install php php-devel php-pear pecl install swoole新建項目 使用composer新建一個ThinkPHP項目&#xff…

每日一練【三數之和】

一、題目描述 15. 三數之和 給你一個整數數組 nums &#xff0c;判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i ! j、i ! k 且 j ! k &#xff0c;同時還滿足 nums[i] nums[j] nums[k] 0 。請 你返回所有和為 0 且不重復的三元組。 注意&#xff1a;答案中不可…

【開題報告】基于SSM的校園體育管預約系統的設計與實現

1.選題背景 隨著社會的發展和人們對健康生活的追求&#xff0c;體育鍛煉在大學生群體中越來越受到重視。校園體育場館是大學生進行體育活動和鍛煉的主要場所之一。然而&#xff0c;由于校園體育場館資源有限&#xff0c;管理不善和預約流程繁瑣等問題&#xff0c;導致場館利用…

【數據結構(九)】線索化二叉樹(3)

文章目錄 1. 前言——問題引出2. 線索二叉樹的基本介紹3. 線索二叉樹的應用案例3.1. 思路分析3.2. 代碼實現 4. 遍歷線索化二叉樹4.1. 代碼實現 1. 前言——問題引出 問題&#xff1a; ????將數列 {1, 3, 6, 8, 10, 14 } 構建成一顆二叉樹. &#xff08;n17個空指針域&…

1688API接口系列,商品詳情數據丨搜索商品列表丨商家訂單類丨1688開放平臺接口使用方案

1688商品詳情接口是指1688平臺提供的API接口&#xff0c;用于獲取商品詳情信息。通過該接口&#xff0c;您可以獲取到商品的詳細信息&#xff0c;包括商品標題、價格、庫存、描述、圖片等。 要使用1688商品詳情接口&#xff0c;您需要先申請1688的API權限&#xff0c;并獲取ac…

老有所依:TSINGSEE青犀養老院智能視頻監管方案

養老院智能監控方案是為了提高養老院內老人的安全和護理質量&#xff0c;利用智能技術與監控設備進行全方位的監控和管理&#xff0c;可以加強對老人的監護和護理&#xff0c;提高養老院的服務質量和安全性。 旭帆科技基于視頻技術與AI智能分析技術構建的養老院智能視頻監控方…

[動態規劃]最長公共子序列

題目六 最長公共子序列 題目描述 我們稱一個字符的數組S為一個序列。對于另外一個字符數組Z,如果滿足以下條件&#xff0c;則稱Z是S的一個子序列&#xff1a;&#xff08;1&#xff09;Z中的每個元素都是S中的元素&#xff08;2&#xff09;Z中元素的順序與在S中的順序一致。…

22 FlexSPI—讀寫外部 SPI NorFlash

文章目錄 22.1 SPI 協議簡介22.1.1 SPI物理層22.1.2 協議22.1.3 CPOL/CPHA 及通訊模式22.1.4 擴展 SPI 協議22.1.5 SDR 和 DDR 模式 22.2 RT1052 的 FlexSPI 特性及架構22.2.1 RT1052 的 FlexSPI 外設簡介22.2.2 RT1052 的 FlexSPI 架構剖析22.2.2.1 通訊引腳22.2.2.2 指令查找…

如何將html網頁免費轉為excel?

一、直接復制。 直接復制是最簡單有效、快捷的解決方案&#xff0c;操作方法如下&#xff1a; 1、用鼠標像平常復制文本一樣&#xff0c;將整個網頁表格選中。 2、點擊右鍵&#xff0c;點擊“復制”。 3、打開excel軟件&#xff0c;鼠標點擊任意單元格。 4、點擊右鍵&#…

Power BI - 5分鐘學習拆分列

每天5分鐘&#xff0c;今天介紹Power BI拆分列功能。 什么是拆分列&#xff1f; 有時導入Power BI的數據表中&#xff0c;某列內容都包含同樣的特殊字符如 /&/-/_等&#xff0c;可以利用這個特殊字符進行拆分列的操作&#xff0c;獲得我們想要的信息。 操作舉例&#xf…

【從編譯器的角度看多態的底層實現原理】

系列文章目錄 歡迎讀者訂閱《計算機底層原理》、《從JVM看Java》系列文章、能夠幫助到大家就是對我最大的鼓勵&#xff01; 文章目錄 目錄 系列文章目錄 文章目錄 前言 一、編譯器做了什么&#xff1f; 1.詞法分析 2.語法分析 3.語義分析 4.中間代碼生成 5.優化 6.目標代碼生成…

SugarCRM 任意文件上傳漏洞復現(CVE-2023-22952)

0x01 產品簡介 SugarCRM是美國SugarCRM公司的一套開源的客戶關系管理系統(CRM)。該系統支持對不同的客戶需求進行差異化營銷、管理和分配銷售線索,實現銷售代表的信息共享和追蹤。 0x02 漏洞概述 SugarCRM index.php接口存在安全漏洞,該漏洞源于安裝組件中存在授權繞過和P…

在線人數(oj題)

題目不少于5個字&#xff0c;所以整了個括號湊字數 首先我想到的是用一個數組來記錄每一秒的在線人數 但是即使是short類型&#xff08;2字節&#xff09;&#xff0c;也會用到60 * 60 * 24 * 30 * 12 * 60 * 2 / 1024 / 1024 3,559.5703125 MB 而題目上限是256MB&#xff0…

UE小:UE5性能分析

開始錄制性能追蹤 要開始錄制性能追蹤&#xff0c;您可以簡單地點擊界面上的“開始錄制”按鈕。 查看追蹤數據 錄制完成后&#xff0c;點擊“Trace”菜單中的“UnrealInsights”選項來查看追蹤數據。 使用命令行進行追蹤 如果點擊錄制按鈕沒有反應&#xff0c;您可以通過命令…

【頭歌系統數據庫實驗】實驗4 MySQL單表查詢

目錄 第1關. 在users表中新增一個用戶&#xff0c;user_id為2019100904學號&#xff0c;name為2019-物聯網-李明 第2關. 在users表中更新用戶 user_id為robot_2 的信息&#xff0c;name設為 機器人二號 第3關. 將solution表中所有 problem_id 為1003 題目的解答結果&#xf…

python源碼,在線讀取傳奇列表,并解析為需要的JSON格式

python源碼&#xff0c;在線讀取傳奇列表&#xff0c;并解析為需要的JSON格式 [Server] ; 使用“/”字符分開顏色&#xff0c;也可以不使用顏色&#xff0c;支持以前的舊格式&#xff0c;只有標題和服務器標題支持顏色 ; 標題/顏色代碼(0-255)|服務器標題/顏色代碼(0-255)|服務…

使用醫學數據集MIMIC,常見的問題記錄

目錄 MIMIC數據庫安裝及數據導入教程1.postgresql安裝第一步&#xff1a;error running考慮到是不是不同的sql的沖突從報錯信息出發重啟之后可以安裝了 2.打開navicate153.7z 不是內部或外部命令&#xff0c;也不是可運行的程序4.在postgreSQL中輸入**\i xxx**命令后遇到提示pe…