亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 Java Java面試題 java多執(zhí)行緒與並發(fā)面試題目(第4題,附答案)

java多執(zhí)行緒與並發(fā)面試題目(第4題,附答案)

Nov 26, 2019 pm 05:17 PM
java

java多執(zhí)行緒與並發(fā)面試題目(第4題,附答案)

4、ConcurrentLinkedQueue非阻塞無界鍊錶隊(duì)列

ConcurrentLinkedQueue是一個(gè)線程安全的隊(duì)列,基於鍊錶結(jié)構(gòu)實(shí)現(xiàn),是一個(gè)無界隊(duì)列,理論上來說隊(duì)列的長度可以無限擴(kuò)大。

與其他佇列相同,ConcurrentLinkedQueue也採用的是先進(jìn)先出(FIFO)入隊(duì)規(guī)則,對元素進(jìn)行排序。 (推薦學(xué)習(xí):java面試題目

當(dāng)我們在佇列中新增元素時(shí),新插入的元素會插入到佇列的尾部;而當(dāng)我們?nèi)〉靡粋€(gè)元素時(shí),它會從隊(duì)列的頭部中取出。

因?yàn)镃oncurrentLinkedQueue是鍊錶結(jié)構(gòu),所以當(dāng)入隊(duì)時(shí),插入的元素依次向後延伸,形成鍊錶;而出隊(duì)時(shí),則從鍊錶的第一個(gè)元素開始獲取,依次遞增;

值得注意的是,在使用ConcurrentLinkedQueue時(shí),如果涉及隊(duì)列是否為空的判斷,切記不可使用size()==0的做法,因?yàn)樵趕ize()方法中,是透過遍歷整個(gè)鍊錶來實(shí)現(xiàn)的,在佇列元素很多的時(shí)候,size()方法十分消耗效能和時(shí)間,只是單純的判斷佇列為空使用isEmpty()即可。

public class ConcurrentLinkedQueueTest {<br/>    public static int threadCount = 10;<br/>    public static ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();<br/>    static class Offer implements Runnable {<br/>        public void run() {<br/>            //不建議使用 queue.size()==0,影響效率??梢允褂?queue.isEmpty()<br/>            if (queue.size() == 0) {<br/>                String ele = new Random().nextInt(Integer.MAX_VALUE) + "";<br/>                queue.offer(ele);<br/>                System.out.println("入隊(duì)元素為" + ele);<br/>            }<br/>        }<br/>    }<br/>    static class Poll implements Runnable {<br/>        public void run() {<br/>            if (!queue.isEmpty()) {<br/>                String ele = queue.poll();<br/>                System.out.println("出隊(duì)元素為" + ele);<br/>            }<br/>        }<br/>    }<br/>    public static void main(String[] agrs) {<br/>        ExecutorService executorService = Executors.newFixedThreadPool(4);<br/>        for (int x = 0; x < threadCount; x++) {<br/>            executorService.submit(new Offer());<br/>            executorService.submit(new Poll());<br/>        }<br/>        executorService.shutdown();<br/>    }<br/>}<br/>

一種輸出:

入隊(duì)元素為313732926<br/>出隊(duì)元素為313732926<br/>入隊(duì)元素為812655435<br/>出隊(duì)元素為812655435<br/>入隊(duì)元素為1893079357<br/>出隊(duì)元素為1893079357<br/>入隊(duì)元素為1137820958<br/>出隊(duì)元素為1137820958<br/>入隊(duì)元素為1965962048<br/>出隊(duì)元素為1965962048<br/>出隊(duì)元素為685567162<br/>入隊(duì)元素為685567162<br/>出隊(duì)元素為1441081163<br/>入隊(duì)元素為1441081163<br/>出隊(duì)元素為1627184732<br/>入隊(duì)元素為1627184732<br/>

ConcurrentLinkedQuere類別圖

java多執(zhí)行緒與並發(fā)面試題目(第4題,附答案)

如圖ConcurrentLinkedQueue中有兩個(gè)volatile類型的Node節(jié)點(diǎn)分別用來存在列表的首尾節(jié)點(diǎn),其中head節(jié)點(diǎn)存放鍊錶第一個(gè)item為null的節(jié)點(diǎn),tail則不是總指向最後一個(gè)節(jié)點(diǎn)。

Node節(jié)點(diǎn)內(nèi)部則維護(hù)一個(gè)變數(shù)item用來存放節(jié)點(diǎn)的值,next用來存放下一個(gè)節(jié)點(diǎn),從而連結(jié)為單向無界列表。

public ConcurrentLinkedQueue(){<br/>    head=tail=new Node<E>(null);<br/>}<br/>

如上程式碼初始化時(shí)候會建構(gòu)一個(gè) item 為 NULL 的空節(jié)點(diǎn)作為鍊錶的首尾節(jié)點(diǎn)。

Offer 操作offer 操作是在鍊錶末端新增一個(gè)元素,

下面看看實(shí)作原理。

public boolean offer(E e) {<br/>    //e 為 null 則拋出空指針異常<br/>    checkNotNull(e);<br/>    //構(gòu)造 Node 節(jié)點(diǎn)構(gòu)造函數(shù)內(nèi)部調(diào)用 unsafe.putObject,后面統(tǒng)一講<br/>    final Node<E> newNode = new Node<E>(e);<br/>    //從尾節(jié)點(diǎn)插入<br/>    for (Node<E> t = tail, p = t; ; ) {<br/>        Node<E> q = p.next;<br/>        //如果 q=null 說明 p 是尾節(jié)點(diǎn)則插入<br/>        if (q == null) {<br/>            //cas 插入(1)<br/>            if (p.casNext(null, newNode)) {<br/>                //cas 成功說明新增節(jié)點(diǎn)已經(jīng)被放入鏈表,然后設(shè)置當(dāng)前尾節(jié)點(diǎn)(包含 head,1,3,5.。。個(gè)節(jié)點(diǎn)為尾節(jié)點(diǎn))<br/>                if (p != t)// hop two nodes at a time<br/>                    casTail(t, newNode); // Failure is OK. return true;<br/>            }<br/>            // Lost CAS race to another thread; re-read next<br/>        } else if (p == q)//(2)<br/>            //多線程操作時(shí)候,由于 poll 時(shí)候會把老的 head 變?yōu)樽砸?,然?head 的 next 變?yōu)樾?head,所以這里需要<br/>            //重新找新的 head,因?yàn)樾碌?head 后面的節(jié)點(diǎn)才是激活的節(jié)點(diǎn)<br/>            p = (t != (t = tail)) ? t : head;<br/>        else<br/>            // 尋找尾節(jié)點(diǎn)(3)<br/>            p = (p != t && t != (t = tail)) ? t : q;<br/>    }<br/>}<br/>

從建構(gòu)子知道一開始有item為null的哨兵節(jié)點(diǎn),而且head和tail都是指向這個(gè)節(jié)點(diǎn)。

以上是java多執(zhí)行緒與並發(fā)面試題目(第4題,附答案)的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
VSCODE設(shè)置。 JSON位置 VSCODE設(shè)置。 JSON位置 Aug 01, 2025 am 06:12 AM

settings.json文件位於用戶級或工作區(qū)級路徑,用於自定義VSCode設(shè)置。 1.用戶級路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區(qū)級路徑:項(xiàng)目根目錄下的.vscode/settings

如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動提交模式,再執(zhí)行多個(gè)操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個(gè)SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時(shí)應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點(diǎn)實(shí)現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

在Java的掌握依賴注入春季和Guice 在Java的掌握依賴注入春季和Guice Aug 01, 2025 am 05:53 AM

依賴性(di)IsadesignpatternwhereObjectsReceivedenciesenciesExtern上,推廣looseSecouplingAndEaseerTestingThroughConstructor,setter,orfieldInjection.2.springfraMefringframeWorkSannotationsLikeLikeLike@component@component,@component,@service,@autowiredwithjava-service和@autowiredwithjava-ligatiredwithjava-lase-lightike

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時(shí)間;3.使用of()方法創(chuàng)建特定日期時(shí)間;4.利用plus/minus方法不可變地增減時(shí)間;5.使用ZonedDateTime和ZoneId處理時(shí)區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時(shí)通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

了解Java虛擬機(jī)(JVM)內(nèi)部 了解Java虛擬機(jī)(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

Google Chrome無法打開本地文件 Google Chrome無法打開本地文件 Aug 01, 2025 am 05:24 AM

ChromecanopenlocalfileslikeHTMLandPDFsbyusing"Openfile"ordraggingthemintothebrowser;ensuretheaddressstartswithfile:///;2.SecurityrestrictionsblockAJAX,localStorage,andcross-folderaccessonfile://;usealocalserverlikepython-mhttp.server8000tor

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

了解網(wǎng)絡(luò)端口和防火牆 了解網(wǎng)絡(luò)端口和防火牆 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

See all articles