成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JDK中使用int類型包裝兩個(gè)原子相關(guān)狀態(tài)

yiliang / 2594人閱讀

摘要:在中想保證操作的原子性的選擇是很少的,大多是使用包裝類。巧妙使用類型的高位低位表達(dá)兩種不中的狀態(tài),此方式可以保證兩種狀態(tài)的原子性。中使用一個(gè)表達(dá)了兩種不相關(guān)的狀態(tài)控制用高位的三個(gè)字節(jié)表示線程池的狀態(tài),其他的字節(jié)表達(dá)工作線程數(shù)。

在JDK中想保證操作的原子性的選擇是很少的,大多是使用Atomic包裝類。巧妙使用int類型的高位、低位表達(dá)兩種不中的狀態(tài),此方式可以保證兩種狀態(tài)的原子性。
JDK中ThreadPoolExecutor使用一個(gè)AtomicInteger表達(dá)了兩種不相關(guān)的狀態(tài)控制:
ctl, is an atomic integer packing two conceptual fields

workerCount, indicating the effective number of threads

runState, indicating whether running, shutting down etc

用高位的三個(gè)字節(jié)表示線程池的狀態(tài),其他的字節(jié)表達(dá)工作線程數(shù)。

packing & unpacking 算法如下:

private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
private static final int COUNT_BITS = Integer.SIZE - 3;
private static final int CAPACITY   = (1 << COUNT_BITS) - 1;

// runState is stored in the high-order bits
private static final int RUNNING    = -1 << COUNT_BITS;
private static final int SHUTDOWN   =  0 << COUNT_BITS;
private static final int STOP       =  1 << COUNT_BITS;
private static final int TIDYING    =  2 << COUNT_BITS;
private static final int TERMINATED =  3 << COUNT_BITS;

// Packing and unpacking ctl
private static int runStateOf(int c)     { return c & ~CAPACITY; }
private static int workerCountOf(int c)  { return c & CAPACITY; }
private static int ctlOf(int rs, int wc) { return rs | wc; }

PS:負(fù)數(shù)的原碼是去掉最高的符號(hào)位的其他位, 后面的位取反為反碼,反碼+1后為補(bǔ)碼。

算法為: 負(fù)數(shù)的絕對(duì)值(原碼)= 取反(補(bǔ)碼-1)

位運(yùn)算:

與運(yùn)算符:& 相同位都為1則取1,否則取0; 
或運(yùn)算符:| 相同位有一個(gè)為1則取1,都為0才取0; 
異或運(yùn)算符:^ 相同則取1,不同則取0;常用:(m ^ n) ^ n = m;(m ^ n) ^ m = n; 
取反運(yùn)算符:~ 相同位0取1,1取0;

Created by 蘇亞強(qiáng)(sueeing@126.com) on 2019/8/2.

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/75729.html

相關(guān)文章

  • 還在用Synchronized?Atomic你了解不?

    摘要:失敗重試自旋比如說,我上面用了個(gè)線程,對(duì)值進(jìn)行加。我們都知道如果在線程安全的情況下,這個(gè)值最終的結(jié)果一定是為的。那就意味著每個(gè)線程都會(huì)對(duì)這個(gè)值實(shí)質(zhì)地進(jìn)行加。 前言 只有光頭才能變強(qiáng) 之前已經(jīng)寫過多線程相關(guān)的文章了,有興趣的同學(xué)可以去了解一下: https://github.com/ZhongFuCheng3y/3y/blob/master/src/thread.md showImg(h...

    陳江龍 評(píng)論0 收藏0
  • Java多線程進(jìn)階(六)—— J.U.C之locks框架:AQS綜述(1)

    摘要:在時(shí),引入了包,該包中的大多數(shù)同步器都是基于來構(gòu)建的??蚣芴峁┝艘惶淄ㄓ玫臋C(jī)制來管理同步狀態(tài)阻塞喚醒線程管理等待隊(duì)列。指針用于在結(jié)點(diǎn)線程被取消時(shí),讓當(dāng)前結(jié)點(diǎn)的前驅(qū)直接指向當(dāng)前結(jié)點(diǎn)的后驅(qū)完成出隊(duì)動(dòng)作。 showImg(https://segmentfault.com/img/remote/1460000016012438); 本文首發(fā)于一世流云的專欄:https://segmentfau...

    cocopeak 評(píng)論0 收藏0
  • Java concurrent 源碼學(xué)習(xí)筆記2 - 鎖

    摘要:同步器的實(shí)現(xiàn)根據(jù)其狀態(tài)是否獨(dú)占而有所不同。這個(gè)框架為同步狀態(tài)的原子性管理線程的阻塞和解除阻塞以及排隊(duì)提供了一種通用的機(jī)制。在需要使用同步器的目標(biāo)類中,繼承了的子類要求被聲明為目標(biāo)類的非公有內(nèi)部類。類通過一組方法實(shí)現(xiàn)線程的阻塞和解除阻塞。 java.util.concurrent.locks包主要是提供線程通信的鎖,下面看一下包中有哪些類。 showImg(https://segment...

    vpants 評(píng)論0 收藏0
  • 【Java并發(fā)編程的藝術(shù)】第二章讀書筆記之原子操作

    摘要:前言今天的筆記來了解一下原子操作以及中如何實(shí)現(xiàn)原子操作。概念原子本意是不能被進(jìn)一步分割的最小粒子,而原子操作意為不可被中斷的一個(gè)或一系列操作。處理器實(shí)現(xiàn)原子操作處理器會(huì)保證基本內(nèi)存操作的原子性。 showImg(https://segmentfault.com/img/bVVIRA?w=1242&h=536); 前言 今天的筆記來了解一下原子操作以及Java中如何實(shí)現(xiàn)原子操作。 概念 ...

    olle 評(píng)論0 收藏0
  • Java面試題

    摘要:近段時(shí)間在準(zhǔn)備實(shí)習(xí)的面試,在網(wǎng)上看到一份面試題,就慢慢試著做,爭(zhēng)取每天積累一點(diǎn)點(diǎn)。現(xiàn)在每天給自己在面試題編寫的任務(wù)是題,有時(shí)候忙起來可能就沒有時(shí)間寫了,但是爭(zhēng)取日更,即使當(dāng)天沒更也會(huì)在之后的更新補(bǔ)上。 ????近段時(shí)間在準(zhǔn)備實(shí)習(xí)的面試,在網(wǎng)上看到一份面試題,就慢慢試著做,爭(zhēng)取每天積累一點(diǎn)點(diǎn)。????暫時(shí)手頭上的面試題只有一份,題量還是挺大的,有208題,所以可能講的不是很詳細(xì),只是我自...

    OnlyMyRailgun 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<