Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ThreadLocal<;T>;JDK中的文档_Java_Multithreading_Thread Local Storage - Fatal编程技术网

Java ThreadLocal<;T>;JDK中的文档

Java ThreadLocal<;T>;JDK中的文档,java,multithreading,thread-local-storage,Java,Multithreading,Thread Local Storage,JDK1.6文档展示了一个关于如何使用LocalThread的示例。我复制并粘贴到这里: 例如,下面的类生成每个线程本地的唯一标识符。线程的id在第一次调用UniqueThreadIdGenerator.getCurrentThreadId()时被分配,并且在后续调用时保持不变 import java.util.concurrent.atomic.AtomicInteger; public class UniqueThreadIdGenerator { private

JDK1.6文档展示了一个关于如何使用
LocalThread
的示例。我复制并粘贴到这里:

例如,下面的类生成每个线程本地的唯一标识符。线程的id在第一次调用
UniqueThreadIdGenerator.getCurrentThreadId()
时被分配,并且在后续调用时保持不变

 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

现在在第一次调用之后,它开始初始化变量。

是的,它应该是
uniqueNum.get()
。选择正确的名称,并使用更好的名称:

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();
    }
}
导入java.util.concurrent.AtomicInteger;
公共类线程ID{
//包含要分配的下一个线程ID的原子整数
私有静态最终AtomicInteger nextId=新的AtomicInteger(0);
//包含每个线程ID的线程局部变量
私有静态最终ThreadLocal threadId=
新ThreadLocal(){
@重写受保护的整数初始值(){
返回nextId.getAndIncrement();
}
};
//返回当前线程的唯一ID,必要时分配它
公共静态int get(){
返回threadId.get();
}
}

但这并不是一个真正的初始化问题——这只是一个完全使用错误成员的问题。即使许多代码在原始代码中使用了
uniqueNum
getCurrentThreadId()
也会始终返回“要分配的下一个ID”,而不是“为当前线程分配的ID”。

是的,它应该是
uniqueNum.get()
。选择正确的名称,并使用更好的名称:

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();
    }
}
导入java.util.concurrent.AtomicInteger;
公共类线程ID{
//包含要分配的下一个线程ID的原子整数
私有静态最终AtomicInteger nextId=新的AtomicInteger(0);
//包含每个线程ID的线程局部变量
私有静态最终ThreadLocal threadId=
新ThreadLocal(){
@重写受保护的整数初始值(){
返回nextId.getAndIncrement();
}
};
//返回当前线程的唯一ID,必要时分配它
公共静态int get(){
返回threadId.get();
}
}

但这并不是一个真正的初始化问题——这只是一个完全使用错误成员的问题。即使许多代码在原始代码中使用了
uniqueNum
getCurrentThreadId()
也会始终返回“要分配的下一个ID”,而不是“为当前线程分配的ID”。

您可以使用每个线程已经拥有的唯一ID,而不是生成唯一的ID<代码>长id=Thread.currentThread().getId()您可以使用每个线程已经拥有的唯一id,而不是生成唯一id<代码>长id=Thread.currentThread().getId()也许还应该重写ThreadLocal的
set
remove
方法并抛出一个。只是一个想法。也许还应该覆盖ThreadLocal的
set
remove
方法并抛出一个。只是一个想法。