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
    
        }
    
    }
  • 相关阅读:
    loj#6433. 「PKUSC2018」最大前缀和(状压dp)
    PKUWC2019游记
    10. Regular Expression Matching
    9. Palindrome Number
    8. String to Integer (atoi)
    7. Reverse Integer
    6. ZigZag Conversion
    5. Longest Palindromic Substring
    4. Median of Two Sorted Arrays
    3. Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/starcrm/p/5009522.html
Copyright © 2011-2022 走看看