资讯专栏INFORMATION COLUMN

JDK中使用int类型包装两个原子相关状态

yiliang / 2538人阅读

摘要:在中想保证操作的原子性的选择是很少的,大多是使用包装类。巧妙使用类型的高位低位表达两种不中的状态,此方式可以保证两种状态的原子性。中使用一个表达了两种不相关的状态控制用高位的三个字节表示线程池的状态,其他的字节表达工作线程数。

在JDK中想保证操作的原子性的选择是很少的,大多是使用Atomic包装类。巧妙使用int类型的高位、低位表达两种不中的状态,此方式可以保证两种状态的原子性。
JDK中ThreadPoolExecutor使用一个AtomicInteger表达了两种不相关的状态控制:
ctl, is an atomic integer packing two conceptual fields

workerCount, indicating the effective number of threads

runState, indicating whether running, shutting down etc

用高位的三个字节表示线程池的状态,其他的字节表达工作线程数。

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:负数的原码是去掉最高的符号位的其他位, 后面的位取反为反码,反码+1后为补码。

算法为: 负数的绝对值(原码)= 取反(补码-1)

位运算:

与运算符:& 相同位都为1则取1,否则取0; 
或运算符:| 相同位有一个为1则取1,都为0才取0; 
异或运算符:^ 相同则取1,不同则取0;常用:(m ^ n) ^ n = m;(m ^ n) ^ m = n; 
取反运算符:~ 相同位0取1,1取0;

Created by 苏亚强(sueeing@126.com) on 2019/8/2.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75729.html

相关文章

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

    摘要:失败重试自旋比如说,我上面用了个线程,对值进行加。我们都知道如果在线程安全的情况下,这个值最终的结果一定是为的。那就意味着每个线程都会对这个值实质地进行加。 前言 只有光头才能变强 之前已经写过多线程相关的文章了,有兴趣的同学可以去了解一下: https://github.com/ZhongFuCheng3y/3y/blob/master/src/thread.md showImg(h...

    陈江龙 评论0 收藏0
  • Java多线程进阶(六)—— J.U.C之locks框架:AQS综述(1)

    摘要:在时,引入了包,该包中的大多数同步器都是基于来构建的。框架提供了一套通用的机制来管理同步状态阻塞唤醒线程管理等待队列。指针用于在结点线程被取消时,让当前结点的前驱直接指向当前结点的后驱完成出队动作。 showImg(https://segmentfault.com/img/remote/1460000016012438); 本文首发于一世流云的专栏:https://segmentfau...

    cocopeak 评论0 收藏0
  • Java concurrent 源码学习笔记2 - 锁

    摘要:同步器的实现根据其状态是否独占而有所不同。这个框架为同步状态的原子性管理线程的阻塞和解除阻塞以及排队提供了一种通用的机制。在需要使用同步器的目标类中,继承了的子类要求被声明为目标类的非公有内部类。类通过一组方法实现线程的阻塞和解除阻塞。 java.util.concurrent.locks包主要是提供线程通信的锁,下面看一下包中有哪些类。 showImg(https://segment...

    vpants 评论0 收藏0
  • 【Java并发编程的艺术】第二章读书笔记之原子操作

    摘要:前言今天的笔记来了解一下原子操作以及中如何实现原子操作。概念原子本意是不能被进一步分割的最小粒子,而原子操作意为不可被中断的一个或一系列操作。处理器实现原子操作处理器会保证基本内存操作的原子性。 showImg(https://segmentfault.com/img/bVVIRA?w=1242&h=536); 前言 今天的笔记来了解一下原子操作以及Java中如何实现原子操作。 概念 ...

    olle 评论0 收藏0
  • Java面试题

    摘要:近段时间在准备实习的面试,在网上看到一份面试题,就慢慢试着做,争取每天积累一点点。现在每天给自己在面试题编写的任务是题,有时候忙起来可能就没有时间写了,但是争取日更,即使当天没更也会在之后的更新补上。     近段时间在准备实习的面试,在网上看到一份面试题,就慢慢试着做,争取每天积累一点点。    暂时手头上的面试题只有一份,题量还是挺大的,有208题,所以可能讲的不是很详细,只是我自...

    OnlyMyRailgun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<