ThreadLocal的深思(或者:sun的javadoc错误吗?)

Maxim交流:

我一直在阅读有关ThreadLocal的文章,试图了解它的工作原理以及我们为什么需要它。

到目前为止,我已经能够学到以下内容:

  1. ThreadLocal类允许在线程级别保存对象的1个实例
  2. 通过重写initialValue()创建实例
  3. 该实例实际上存储在每个线程的HashMap中
  4. 可在此处找到常识用法示例

一切似乎都很好,直到我尝试从javadoc运行示例之前,提供的代码如下:

 import java.util.concurrent.atomic.AtomicInteger;

 public class UniqueThreadIdGenerator {

     private static final AtomicInteger uniqueId = new AtomicInteger(0);

     private static final ThreadLocal < Integer > uniqueNum = 
         new ThreadLocal < Integer > () {
             @Override protected Integer initialValue() {
                 return uniqueId.getAndIncrement();
         }
     };

     public static int getCurrentThreadId() {
         return uniqueId.get();
     }
 } // UniqueThreadIdGenerator

如果我正确理解此代码,则调用getCurrentThreadId()应该返回正确的自动递增线程号,因为它为我返回了0。始终为0,不考虑我已启动了多少个线程。

为了使它对我有用,我不得不将getCurrentThreadId()更改为读取

     public static int getCurrentThreadId() {
         return uniqueId.get();
     } 

在这种情况下,我会得到正确的值。

下面提供了我的代码,我缺少什么?(不是javadoc实际上是错误的,对吗?)

package org.vekslers;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class UniqueThreadIdGenerator extends Thread {

    private static final AtomicInteger uniqueId = new AtomicInteger(0);

    private static final ThreadLocal <Integer> uniqueNum = 
        new ThreadLocal <Integer> () {
            @Override protected Integer initialValue() {
                return uniqueId.getAndIncrement();
        }
    };

    public static int getCurrentThreadId() {
        return uniqueNum.get();
    }




    //////////////////////////////////////////////////
    // Testing code...
    //////////////////////////////////////////////////
    private static volatile boolean halt = false;

    public UniqueThreadIdGenerator(String threadName) {
        super(threadName);
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread() + " PREHALT " + getCurrentThreadId());
        while(!halt)
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
            }
        System.out.println(Thread.currentThread() + " POSTHALT " + getCurrentThreadId());
    }

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new UniqueThreadIdGenerator("t1");
        Thread t2 = new UniqueThreadIdGenerator("t2");
        Thread t3 = new UniqueThreadIdGenerator("t3");
        Thread t4 = new UniqueThreadIdGenerator("t4");

        t3.start();
        t1.start();
        t2.start();
        t4.start();

        TimeUnit.SECONDS.sleep(10);
        halt = true;
    }
} // UniqueThreadIdGenerator

输出:

Thread[t3,5,main] PREHALT 0
Thread[t1,5,main] PREHALT 1
Thread[t2,5,main] PREHALT 2
Thread[t4,5,main] PREHALT 3
Thread[t4,5,main] POSTHALT 3
Thread[t2,5,main] POSTHALT 2
Thread[t1,5,main] POSTHALT 1
Thread[t3,5,main] POSTHALT 0

ps代码注释OT或至此是受欢迎的注释。

史蒂芬·丹尼(Stephen Denne):

javadocs是错误的。
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6475885

Java 7的javadoc包括

 import java.util.concurrent.atomic.AtomicInteger;

 public class ThreadId {
     // Atomic integer containing the next thread ID to be assigned
     private static final AtomicInteger nextId = new AtomicInteger(0);

     // Thread local variable containing each thread's ID
     private static final ThreadLocal<Integer> threadId =
         new ThreadLocal<Integer>() {
             @Override protected Integer initialValue() {
                 return nextId.getAndIncrement();
         }
     };

     // Returns the current thread's unique ID, assigning it if necessary
     public static int get() {
         return threadId.get();
     }
 }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

此回购丢失了文件吗,或者我使用的是错误的?

错误:jdk-13.0.2中不存在包com.sun.javadoc

Java ThreadLocal静态吗?

ThreadLocal线程安全吗?

这真的是JAVASCRIPT中的错误吗,或者Date,数据类型是否做错了

这是一个错误吗?或者,如何调试2sxc ApiController?

Maven项目所需的sun.javadoc jar

过期的证书可以生成sun.security.validator.ValidatorException错误吗?

Maven错误构建javadoc

Javadoc生成失败:ClassCastException:com.sun.tools.javadoc.ClassDocImpl无法转换为com.sun.javadoc.AnnotationTypeDoc

我使用Angular Renerer2错误,或者它损坏了。任何人都可以解决吗?

Hibernate ThreadLocal会话管理与ForkJoinPool兼容吗?

替换为反模式ThreadLocal吗?

导入com.sun.javadoc无法在Eclipse中解析

如何在Eclipse中导入com.sun.javadoc。*?

python 3.6错误或者我疯了

发生SQL错误,或者我缺少语法?

修复Java 8的Javadoc错误

产生Javadoc错误Android Studio

取决于Eclipse中tools.jar(Sun JDK)中的com.sun.javadoc

Javadoc:如何修复:“错误的HTML实体”错误

在线有中央的javadoc存储库吗?

在构造函数中设置ThreadLocal变量有效吗?

Java内存性能-奇怪的行为(或者这是正常现象吗?)

开发WUBI很难吗?为什么或者为什么不?

在谷歌图表中这可能吗?或者有替代或黑客

有“中型”副本吗?或者:如何精确控制复制的“深度”?

这个列表枚举方法可以更短吗?或者更pythonic?

AMP 执行 PHP 吗?或者它只是存储 HTML 输出?