JUC Striped64

论坛 期权论坛     
选择匿名的用户   2021-6-1 17:14   565   0
<p align="left"><span style="font-family:&#39;Microsoft YaHei&#39;;">java.util.concurrent<br></span></p>
<p align="left"><span style="font-family:&#39;Microsoft YaHei&#39;;">该包中提供了很多并发环境中表现优秀的类,今天先来介绍下java.util.concurrent.atomic.Striped64这个类</span></p>
<p><span style="font-family:&#39;Microsoft YaHei&#39;;">Striped64的基本思想是热点数据分离,从Striped64这个类的字面意也可以进行理解, Stripe的中文意思包含拆分,条纹化的意思.Striped64是一个抽象类,继承自Number.</span></p>
<p><span style="font-family:&#39;Microsoft YaHei&#39;;">首先介绍一下Striped64比较重要的一个内部类Cell,这个内部类是热点数据分离的关键,先贴下源码</span></p>
<p><span style="font-family:&#39;Microsoft YaHei&#39;;"></span></p>
<pre style="background-color:#2b2b2b;color:#7d8b9a;font-family:&#39;Courier New&#39;;font-size:9pt;"><span style="color:#bbb529;">&#64;sun.misc.Contended </span><span style="color:#cc8932;font-weight:bold;">
static final class </span><span style="color:#88c9f2;font-weight:bold;">Cell </span>{
    <span style="color:#cc8932;font-weight:bold;">volatile long </span><span style="color:#9876aa;">value</span><span style="color:#cc7832;">;
</span><span style="color:#cc7832;">    </span><span style="color:#ffc66d;">Cell</span>(<span style="color:#cc8932;font-weight:bold;">long </span>x) { <span style="color:#9876aa;">
        value </span>&#61; x<span style="color:#cc7832;">; </span>
    }
    <span style="color:#cc8932;font-weight:bold;">final boolean </span><span style="color:#ffc66d;">cas</span>(<span style="color:#cc8932;font-weight:bold;">long </span>cmp<span style="color:#cc7832;">, </span><span style="color:#cc8932;font-weight:bold;">long </span>val) {
        <span style="color:#cc8932;font-weight:bold;">return </span><span style="color:#9876aa;font-style:italic;">UNSAFE</span>.compareAndSwapLong(<span style="color:#cc8932;font-weight:bold;">this</span><span style="color:#cc7832;">, </span><span style="color:#9876aa;font-style:italic;">valueOffset</span><span style="color:#cc7832;">, </span>cmp<span style="color:#cc7832;">, </span>val)<span style="color:#cc7832;">;
</span><span style="color:#cc7832;">    </span>}

    <span style="color:#808080;">// Unsafe mechanics
</span><span style="color:#808080;">    </span><span style="color:#cc8932;font-weight:bold;">private static final </span><span style="color:#88c9f2;font-weight:bold;">sun.misc.Unsafe </span><span style="color:#9876aa;font-style:italic;">UNSAFE</span><span style="color:#cc7832;">;
</span><span style="color:#cc7832;">    </span><span style="color:#cc8932;font-weight:bold;">private static final long </span><span style="color:#9876aa;font-style:italic;">valueOffset</span><span style="color:#cc7832;">;
</span><span style="color:#cc7832;">    </span><span style="color:#cc8932;font-weight:bold;">static </span>{
        <span style="color:#cc8932;font-weight:bold;">try </span>{
            <span style="color:#9876aa;font-style:italic;">UNSAFE </span>&#61; <span style="color:#88c9f2;font-weight:bold;">sun.misc.Unsafe</span>.<span style="font-style:italic;">getUnsafe</span>()<span style="color:#cc7832;">;
</span><span style="color:#cc7832;">            </span><span style="color:#88c9f2;font-weight:bold;">Class</span>&lt;?&gt; ak &#61; <span style="color:#88c9f2;font-weight:bold;">Cell</span>.<span style="color:#cc8932;font-weight:bold;">class</span><span style="color:#cc7832;">;
</span><span style="color:#cc7832;">            </span><span style="color:#9876aa;font-style:italic;">valueOffset </span>&#61; <span style="color:#9876aa;font-style:italic;">UNSAFE</span>.objectFieldOffset
                (ak.getDeclaredField(<span style="color:#6a8759;">&#34;value&#34;</span>))<span style="color:#cc7832;">;
</span><span style="color:#cc7832;">        </span>} <span style="color:#cc8932;font-weight:bold;">catch </span>(<span style="color:#88c9f2;font-weight:bold;">Exception </span>e) {
            <span style="color:#cc8932;font-weight:bold;">throw new </span>Error(e)<span style="color:#cc7832;">;
</span><span style="color:#cc7832;">        </span>}
    }
}</pre>
<p>&#64;sun.misc.Contended</p>
<p>这个注解是以一种更优雅的方式避免伪共享问题(注:伪共享的相关问题可自行搜索),是一种以空间换时间的解决方案.java8之前的版本为了避免伪共享问题需要开发者自行进行缓存行填充,这种实现方式非常不友好,并且在java7版本中JVM会自动优化,无用的填充字段不能生效,java8则提供了这个注解,更优雅的避免了伪共享的问题.</p>
<p>接下来介绍Cell中比较重要的成员变量</p>
<p>volatile long value: <br></p>
<p>value就是用来承载实际的数据,用volatile修饰解决的主要问题是所线程访问中的可见性问题</p>
<p>volatile详解可以参考<a href="https://www.cnblogs.com/tangyanbo/p/6538488.html">https://www.cnblogs.com/tangyanbo/p/6538488.html</a></p>
<p><br></p>
<p>private static final sun.misc.Unsafe UNSAFE : <br></p>
<p>从这个类的字面意思可以理解为&#34;不安全的&#34;,在计算机领域中什么是不安全的,学习过c或者c&#43;&#43;的同学肯定知道指针是不安全,java语言已经对开发者屏蔽了直接内存地址的操作,但是具体内存地址的操作又不可以避免,Unsafe这个类就是用来操作内存的.</p>
<p>进入Unsafe类的内部,
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP