1.防止任务在共享资源上产生冲突的第二种方式是根除对变量的共享。
线程本地存储是一种自动化机制,可以为使用相同变量的每个不同的线程都创建不同的存储。因此如果你有5个线程都要使用变量x所表示的对象,那线程本地存储就会生成5个用于x的不同的存储块。主要是,它们使得你可以将状态与线程关联起来。
2.创建和管理本地线程由java.lang.ThreadLocal类实现
3.例1
package
jiangning;
import
java.util.Random;
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
import
java.util.concurrent.TimeUnit;
class
Accessor
implements
Runnable{
private
final
int
id
;
public
Accessor(
int
idn){
this
.
id
= idn;
}
public
void
run() {
while
(!Thread.currentThread().isInterrupted()){
ThreadLocalVariableHolder. increment();
System.
out
.println(
this
);
Thread. yield();
}
}
public
String toString(){
return
"#"
+
id
+
" : "
+ ThreadLocalVariableHolder. get();
}
}
public
class
ThreadLocalVariableHolder {
private
static
ThreadLocal<Integer>
value
=
new
ThreadLocal<Integer>(){
private
Random
rand
=
new
Random(47);
protected
synchronized
Integer initialValue(){
return
rand
.nextInt(1000);
}
};
public
static
void
increment(){
value
.set(
value
.get()+1);
}
public
static
int
get(){
return
value
.get();
}
public
static
void
main(String[] args)
throws
Exception {
ExecutorService exec = Executors. newCachedThreadPool();
for
(
int
i=0; i<5; i++){
exec.execute(
new
Accessor(i));
//创建了5个线程
}
TimeUnit.
SECONDS
.sleep(3);
exec.shutdownNow();
}
}
/**
*
部分输出结果是
#2
:
25214
#0
:
23754
#1
:
19794
#3
:
20652
#3
:
20653
#3
:
20654
*/
分析:一个
ThreadLocalVariableHolder
对象,每个单独的线程都被分配了自己的存储,它们每个都需要跟踪自己的计数值。