java的ThreadLocal,了解一下


public class MyThreadLocal {
    static class ThreadMain{


        private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>(){
            @Override
            protected Integer initialValue() {
                return 0 ;
            }

        };


        /*
         * ThreadLocal为每个使用该变量的线程提供独立的变量副本
         * 每个线程都可以独立的改变自己的副本,不影响其他线程所对应的副本
         * 目标变量就像是本地变量
         * 
         * set 设置当前线程的线程局部变量的值
         * get返回当前线程所对应的线程局部变量
         * remove 将当前线程局部变量的值删除,线程结束后,该变量会自动被回收,使用该方法可以加快内存回收速度
         * initialValue  返回该线程局部变量的初始值,
         * 这个方法是一个延迟调用方法,在第一次get/set时才执行,只执行一次,缺省返回一个null
         * 
         */

        /*
         * ThreadLocal 实现了线程的变量拷贝
         * 
         * 线程隔离的实现就是ThreadLocalMap这个类
         * 是ThreadLocal类的一个静态内部类
         * 实现了键值对的设置和取值
         * 每个线程中都有一个独立的ThreadLocalMap副本
         * 存储的值只能被当前线程读取和修改
         * 每个线程只能操作自己的线程副本从而实现了线程隔离
         */

        /*
         * 在处理线程的局部变量的时候比synchronized同步机制解决线程安全问题更简单
         * 结果程序拥有更高的并发性
         * 一般都是声明在静态变量中的threadlocal
         * 不断创建没有调用remove,将会导致内存泄漏
         */
        public ThreadLocal<Integer> getThreadLocal() {
            return seqNum;

        }

        public int getNextNum() {
            seqNum.set(seqNum.get() +1);
            return seqNum.get();

        }

    }

      static class TestClient extends Thread {

        private ThreadMain sn ;
        public TestClient(ThreadMain sn) {
            this.sn = sn;

        }
        @Override
        public void run() {
            for (int i = 0 ; i < 5 ;i++){
                System.out.println(Thread.currentThread().getName() 
                        + ",sn = " + sn.getNextNum()
                        + " ,id = " + Thread.currentThread().getId());
                System.err.println();
                sn.getThreadLocal().remove();
            }
        }

    }

    public static void main(String[] args) {
        ThreadMain sn = new ThreadMain();
        TestClient testClient = new TestClient(sn);
        TestClient testClient2 = new TestClient(sn);
        testClient.start();
        testClient2.start();
    }
}


猜你喜欢

转载自blog.csdn.net/java_sparrow/article/details/81220672