该类提供勒线程局部变量。这些变量不同与它们的普通对应物,因为访问一个变量(通过其get 或 set方法)的每个线程都是有自己的局部变量,它独立与变量的初始化副本。ThreadLocal实例通常是类中的私有静态字段,他们希望将状态与某一个线程(例如,用户ID或事务ID)相关联。
以上为书中内容,有点难懂。我理解为,案例一中定义的一个普通变量被所有线程所共享。而案例二中以ThreadLocal定义的变量则只存在与每一个单独线程
例 1.
[list]
[*]控制台
8:0
8:1
9:2
9:3
10:4
10:5
[/list]
例 2.
[list]
[*]控制台
8:0
8:1
9:0
9:1
10:0
10:1
[/list]
以上为书中内容,有点难懂。我理解为,案例一中定义的一个普通变量被所有线程所共享。而案例二中以ThreadLocal定义的变量则只存在与每一个单独线程
例 1.
package com.mz.xx.tb;
public class SerialNum1 {
private static int serialNum = 0;
public static int get(){
return serialNum++;
}
public static void main(String[] args) {
new Thread(new MyThread1()).start();
new Thread(new MyThread1()).start();
new Thread(new MyThread1()).start();
}
}
class MyThread1 implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
long tno = Thread.currentThread().getId();
System.out.println(tno + ":" +SerialNum1.get());
System.out.println(tno + ":" +SerialNum1.get());
}
}
[list]
[*]控制台
8:0
8:1
9:2
9:3
10:4
10:5
[/list]
例 2.
package com.mz.xx.tb;
public class SerialNum {
private static ThreadLocal<Integer> serialNum = new ThreadLocal<Integer>();
public static int get(){
int value = 0;
if(serialNum.get()!=null){
value = ((Integer)(serialNum.get())).intValue();
}
serialNum.set(++value);
return value - 1;
}
public static void main(String[] args) {
new Thread(new MyThread()).start();
new Thread(new MyThread()).start();
new Thread(new MyThread()).start();
}
}
class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
long tno = Thread.currentThread().getId();
System.out.println(tno + ":" +SerialNum.get());
System.out.println(tno + ":" +SerialNum.get());
}
}
[list]
[*]控制台
8:0
8:1
9:0
9:1
10:0
10:1
[/list]