zoukankan      html  css  js  c++  java
  • JAVA线程本地变量ThreadLocal和私有变量的区别

    ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。
    所以,在Java中编写线程局部变量的代码相对来说要笨拙一些,因此造成线程局部变量没有在Java开发者中得到很好的普及。
    ThreadLocal的接口方法
    ThreadLocal类接口很简单,只有4个方法,我们先来了解一下:
    void set(Object value)
    public void remove()
    将当前线程局部变量的值删除,目的是为了减少内存的占用。
     
    ThreadLocal的原理
    在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。比如下面的示例实现:
    public class ThreadLocal
    private Map values = Collections.synchronizedMap(new HashMap());
    public Object get()
    {
    Thread curThread = Thread.currentThread();
    Object o = values.get(curThread);
    if (o == null && !values.containsKey(curThread))
    {
    o = initialValue();
    values.put(curThread, o);
    }
    values.put(Thread.currentThread(), newValue);
    return o ;
    }
    public Object initialValue()
    {
    return null;
    }
    }
     
     
    演示代码
     
    public class ThreadLocalExample {
    
        public static class MyRunnable implements Runnable {
    
            private ThreadLocal<Integer> threadLocal =
    
            new ThreadLocal<Integer>();
            int local = 0;
    
            @Override
            public void run() {
    
                threadLocal.set((int) (Math.random() * 100D));
                local = (int) (Math.random() * 100D);
    
                try {
    
                    Thread.sleep(2000);
    
                } catch (InterruptedException e) {
    
                }
    
                System.out.println("threadLocal:" +threadLocal.get());
                System.out.println("local:" +local);
    
            }
    
        }
    
        public static void main(String[] args) {
    
            MyRunnable sharedRunnableInstance = new MyRunnable();
    
            Thread thread1 = new Thread(sharedRunnableInstance);
    
            Thread thread2 = new Thread(sharedRunnableInstance);
    
            thread1.start();
    
            thread2.start();
    
            try {
                thread1.join();
                thread2.join(); 
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } // wait for thread 1 to terminate
    
            // wait for thread 2 to terminate
    
        }
    
    }
  • 相关阅读:
    drf认证组件
    播放音频
    推荐
    makefile编写
    qt文件操作mv
    qt文件http网络下载
    为qt在window上用源代码编译库 (部分转载)
    qt线程池(转)
    crc校验
    树莓派网络配置查询
  • 原文地址:https://www.cnblogs.com/starcrm/p/5009522.html
Copyright © 2011-2022 走看看