ThreadLocal这个类提供了一个线程本地的变量。这些变量在被共享访问的情况下在不同的线程里是独立的 ( 必须通过 get 和 set 方法来访问 ) 。
例子 1 :没有使用 Threadlocal 的情况:- public class TestWithNoThreadLocal {
- public static int a = 0;
- public static void main(String[] args) {
- MyThread myThread = new MyThread();
- myThread.start();
- for ( int i = 0; i < 5; i++) {
- a = a + 1;
- System. out .println(Thread. currentThread ().getName() + ":" + a );
- }
- }
- public static class MyThread extends Thread {
- public void run() {
- for ( int i = 0; i < 5; i++) {
- a = a + 1;
- System. out .println(Thread. currentThread ().getName() + ":" + a );
- }
- }
- }
- }
复制代码 运行的一种结果如下:
main:2
Thread-0:2
main:3
Thread-0:4
main:5
Thread-0:6
main:7
Thread-0:8
main:9
Thread-0:10
在没有同步的机制下,该结果有不安全的情况发生是正常的,两个线程都得到 2 。下面请看用了 ThreadLocal 的效果。
例子 2 :使用了 Threadlocal 的情况:- public class TestThreadLocal2 {
- private static ThreadLocal<Integer> a = new ThreadLocal<Integer>() {
- public Integer initialValue() { // 初始化,默认是返回 null
- return 0;
- }
- };
- public static void main(String args[]) {
- MyThread my;
- my = new MyThread();
- my.start();
- for ( int i = 0; i < 5; i++) {
- a .set( a .get() + 1);
- System. out .println(Thread. currentThread ().getName() + ":" + a .get());
- }
- }
- public static class MyThread extends Thread {
- public void run() {
- for ( int i = 0; i < 5; i++) {
- a .set( a .get() + 1);
- System. out .println(Thread. currentThread ().getName() + ":"
- + a .get());
- }
- }
- }
- }
复制代码 运行的一种结果如下:
main:1
Thread-0:1
main:2
Thread-0:2
main:3
Thread-0:3
main:4
Thread-0:4
Thread-0:5
main:5
如上是关于 ThreadLocal 的简单介绍。其内部具体实现可看其类实现。
|