当前位置:  开发笔记 > 编程语言 > 正文

java.lang.Thread中的新增附加字段,有什么想法?

如何解决《java.lang.Thread中的新增附加字段,有什么想法?》经验,为你挑选了1个好方法。

在Java 8中,java.lang.Thread类有3个新字段:

/** The current seed for a ThreadLocalRandom */
@sun.misc.Contended("tlr")
long threadLocalRandomSeed;

/** Probe hash value; nonzero if threadLocalRandomSeed initialized */
@sun.misc.Contended("tlr")
int threadLocalRandomProbe;

/** Secondary seed isolated from public ThreadLocalRandom sequence */
@sun.misc.Contended("tlr")
int threadLocalRandomSecondarySeed;

正如它在Javadoc中所说的那样是由专门管理的java.util.concurrent.ThreadLocalRandom.

此外,ThreadLocalRandom它们以非常奇特的方式使用:

SEED = UNSAFE.objectFieldOffset
    (tk.getDeclaredField("threadLocalRandomSeed"));
PROBE = UNSAFE.objectFieldOffset
    (tk.getDeclaredField("threadLocalRandomProbe"));
SECONDARY = UNSAFE.objectFieldOffset
    (tk.getDeclaredField("threadLocalRandomSecondarySeed"));

(同样的代码片也可以在LockSupport课堂上得到满足).

然后这个偏移在几个java.concurrent地方内部使用.

这个想法是什么?为什么这些字段在里面java.lang.Thread?为什么不在里面ThreadLocalRandom



1> Tunaki..:

这些是内部字段.解释只能来自JDK开发人员自己.我从2013年1月的Doug Lea 那里找到了一篇关于这个的帖子,这个帖子解释了这些领域背后的理由以及为什么他们在Thread课堂上.

当我们介绍时ThreadLocalRandom,我们保守地实现它以使用实际ThreadLocal.然而,随着它的使用越来越广泛,通过ThreadLocalRandom在课堂上容纳州(和相关的簿记)来改善实施是值得的Thread.这将需要三个字段(总共16个字节).

所以我建议在Thread类中添加以下内容:

// The following three initially uninitialized fields are exclusively
// managed by class java.util.concurrent.ThreadLocalRandom.
/** The current seed for a ThreadLocalRandom */
long threadLocalRandomSeed;
/** Probe hash value; nonzero if threadLocalRandomSeed initialized */
int threadLocalRandomProbe;
/** Secondary seed isolated from public ThreadLocalRandom sequence */
int threadLocalRandomSecondarySeed;

这样做的原因是:

    一致更快地进入ThreadLocalRandom州.虽然 ThreadLocal访问通常已经非常快,但这不仅更快,而且在用户程序创建大量ThreadLocals的情况下不会降低,这可能(概率上)导致任何给定访问变慢.

    任何程序使用的总占用空间都较小ThreadLocalRandom.三个字段比装入填充ThreadLocal对象所需的空间更少 .随着ThreadLocalRandomJDK本身的广泛使用,这几乎包括所有程序.

    而且时间/空间节省java.util.concurrent ForkJoinPool, ConcurrentHashMap,LongAdder,ConcurrentSkipList,和可以使用这种形式的统一的其他类ThreadLocalRandom 簿记,而不是他们自己的专用ThreadLocalS作为他们现在要做的.


@Andremoniy老实说,我无法判断JDK开发人员自己制定的技术解决方案.他们被添加到Thread的原因可能归结为Doug Lea的评论:"但主要是:"永久"线程本地人的空间需要放在某处;为什么不选择提供最少物流问题的地方?注意类java.lang.Thread只是系统上每线程存储的冰山一角,因此添加16字节几乎是不可检测的."
@Andremoniy:如果这些字段是在'ThreadLocalRandom`中声明的,那么每个线程需要一个不同的`ThreadLocalRandom`实例,这个实例需要`ThreadLocalRandom.current()`来使用`ThreadLocal`变量,这被认为是不够有效的.因此,`ThreadLocalRandom.current()`返回一个廉价的单例实例,但暗示它不能托管这些每个线程必须不同的字段.因此,在给定当前实现*的情况下,这些字段存储在`Thread`实例*中.
推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有