• 热门专题

ThreadLocal实现线程范围的共享变量

作者:com360的专栏  发布日期:2011-09-19 13:07:04
Tag标签:ThreadLocal  线程范围  共享变量  
  • ThreadLocal的作用和目的:用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另一个线程中则共享另一份数据,线程的数据是独享的。

     ThreadLocal的实现原理:每个线程调用全局ThreadLocal的set方法,就相当于往其内部的Map中增加一条记录,key是各自的线程,value是各自的线程调用set放进的值。在线程结束时可以调用ThreadLocal.clear()方法,可以立即释放内存。也可以不调用,线程运行完成之后内存也会被回收。

    ThreadLocal的应用场景:

     (1)订单处理

       (2)银行转账等

      Struts2中ActionContext,同一段代码被不同的线程调用运行时,该代码操纵的是各自的线程的状态和数据。对于不同的线程来说,getContext()拿到的对象都不同,不管拿多少次,不管在哪个模块,这一个线程拿到的都是同一个对象。

    下面是一个关于ThreadLocal的例子:

    package thread.tradtionnal;  
      
    import java.util.HashMap;  
    import java.util.Map;  
    import java.util.Random;  
      
    public class ThreadLocalTest {  
        //public static int data;  
          
        /** 
         * @param args 
         */  
        public static void main(String[] args) {  
            for(int i=0;i<2;i++){  
                  
                new Thread(new Runnable(){  
                      
                    @Override  
                    public void run() {  
                        int data = new Random().nextInt();  
                        System.out.println("data---" + data);  
                        MyData.getInstance().setAge(data);  
                        MyData.getInstance().setName(Thread.currentThread()+"-"+data);  
                        new ThreadA().getData();  
                        new ThreadB().getData();  
                    }  
                      
                }).start();  
            }  
        }  
        static class ThreadA{  
            public void getData(){  
                System.out.println("ThreadA -- " + Thread.currentThread().getName()+"-age=" + MyData.getInstance().getAge()+",name-"+ MyData.getInstance().getName());  
            }  
        }  
          
        static class ThreadB{  
            public void getData(){  
                System.out.println("ThreadB -- " + Thread.currentThread().getName()+"-age=" + MyData.getInstance().getAge()+",name-"+ MyData.getInstance().getName());  
            }  
        }  
          
      
    }  
    class MyData{  
        private String name;  
        private int age;  
        private static MyData instance = null;  
        private static ThreadLocal<MyData> map = new ThreadLocal<MyData>();  
        private MyData(){};  
        public static MyData getInstance(){  
            instance = map.get();  
            if( instance == null){  
                instance = new MyData();  
                map.set(instance);  
            }  
            return instance;  
        }  
        public String getName() {  
            return name;  
        }  
        public void setName(String name) {  
            this.name = name;  
        }  
        public int getAge() {  
            return age;  
        }  
        public void setAge(int age) {  
            this.age = age;  
        }  
          
          
    }  

    word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">运行结果

    data---1874800790  
    data----781274110  
    ThreadA -- Thread-1-age=-781274110,name-Thread[Thread-1,5,main]--781274110  
    ThreadA -- Thread-0-age=1874800790,name-Thread[Thread-0,5,main]-1874800790  
    ThreadB -- Thread-0-age=1874800790,name-Thread[Thread-0,5,main]-1874800790  
    ThreadB -- Thread-1-age=-781274110,name-Thread[Thread-1,5,main]--781274110 
About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规