摘要:在中想保證操作的原子性的選擇是很少的,大多是使用包裝類。巧妙使用類型的高位低位表達(dá)兩種不中的狀態(tài),此方式可以保證兩種狀態(tài)的原子性。中使用一個表達(dá)了兩種不相關(guān)的狀態(tài)控制用高位的三個字節(jié)表示線程池的狀態(tài),其他的字節(jié)表達(dá)工作線程數(shù)。
在JDK中想保證操作的原子性的選擇是很少的,大多是使用Atomic包裝類。巧妙使用int類型的高位、低位表達(dá)兩種不中的狀態(tài),此方式可以保證兩種狀態(tài)的原子性。
JDK中ThreadPoolExecutor使用一個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
用高位的三個字節(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ù)的原碼是去掉最高的符號位的其他位, 后面的位取反為反碼,反碼+1后為補碼。
算法為: 負(fù)數(shù)的絕對值(原碼)= 取反(補碼-1)
位運算:
與運算符:& 相同位都為1則取1,否則取0; 或運算符:| 相同位有一個為1則取1,都為0才取0; 異或運算符:^ 相同則取1,不同則取0;常用:(m ^ n) ^ n = m;(m ^ n) ^ m = n; 取反運算符:~ 相同位0取1,1取0;
Created by 蘇亞強([email protected]) on 2019/8/2.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75729.html
摘要:失敗重試自旋比如說,我上面用了個線程,對值進(jìn)行加。我們都知道如果在線程安全的情況下,這個值最終的結(jié)果一定是為的。那就意味著每個線程都會對這個值實質(zhì)地進(jìn)行加。 前言 只有光頭才能變強 之前已經(jīng)寫過多線程相關(guān)的文章了,有興趣的同學(xué)可以去了解一下: https://github.com/ZhongFuCheng3y/3y/blob/master/src/thread.md showImg(h...
摘要:在時,引入了包,該包中的大多數(shù)同步器都是基于來構(gòu)建的。框架提供了一套通用的機制來管理同步狀態(tài)阻塞喚醒線程管理等待隊列。指針用于在結(jié)點線程被取消時,讓當(dāng)前結(jié)點的前驅(qū)直接指向當(dāng)前結(jié)點的后驅(qū)完成出隊動作。 showImg(https://segmentfault.com/img/remote/1460000016012438); 本文首發(fā)于一世流云的專欄:https://segmentfau...
摘要:同步器的實現(xiàn)根據(jù)其狀態(tài)是否獨占而有所不同。這個框架為同步狀態(tài)的原子性管理線程的阻塞和解除阻塞以及排隊提供了一種通用的機制。在需要使用同步器的目標(biāo)類中,繼承了的子類要求被聲明為目標(biāo)類的非公有內(nèi)部類。類通過一組方法實現(xiàn)線程的阻塞和解除阻塞。 java.util.concurrent.locks包主要是提供線程通信的鎖,下面看一下包中有哪些類。 showImg(https://segment...
摘要:前言今天的筆記來了解一下原子操作以及中如何實現(xiàn)原子操作。概念原子本意是不能被進(jìn)一步分割的最小粒子,而原子操作意為不可被中斷的一個或一系列操作。處理器實現(xiàn)原子操作處理器會保證基本內(nèi)存操作的原子性。 showImg(https://segmentfault.com/img/bVVIRA?w=1242&h=536); 前言 今天的筆記來了解一下原子操作以及Java中如何實現(xiàn)原子操作。 概念 ...
摘要:近段時間在準(zhǔn)備實習(xí)的面試,在網(wǎng)上看到一份面試題,就慢慢試著做,爭取每天積累一點點?,F(xiàn)在每天給自己在面試題編寫的任務(wù)是題,有時候忙起來可能就沒有時間寫了,但是爭取日更,即使當(dāng)天沒更也會在之后的更新補上。 ????近段時間在準(zhǔn)備實習(xí)的面試,在網(wǎng)上看到一份面試題,就慢慢試著做,爭取每天積累一點點。????暫時手頭上的面試題只有一份,題量還是挺大的,有208題,所以可能講的不是很詳細(xì),只是我自...
閱讀 2631·2021-11-17 17:00
閱讀 1884·2021-10-11 10:57
閱讀 3751·2021-09-09 11:33
閱讀 921·2021-09-09 09:33
閱讀 3558·2019-08-30 14:20
閱讀 3325·2019-08-29 11:25
閱讀 2809·2019-08-26 13:48
閱讀 747·2019-08-26 11:52