找回密码

碧海潮声大学生网

查看: 238|回复: 0
打印 上一主题 下一主题

Java并发编程之ThreadLocal类详解

[复制链接]
跳转到指定楼层
1#
发表于 2015-3-16 11:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ThreadLocal类可以理解为ThreadLocalVariable(线程局部变量),提供了get与set等访问接口或方法,这些方法为每个使用该变量的线程都存有一份独立的副本,因此get总是返回当前执行线程在调用set时设置的最新值。可以将ThreadLocal视为 包含了Map[td]对象,保存了特定于该线程的值。

概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

模拟ThreadLocal



    import java.util.Collections;import java.util.HashMap;import java.util.Map; public class SimpleThreadLocal {        private Map[td] valueMap = Collections                        .synchronizedMap(new HashMap[td]());         public void set(T newValue) {                valueMap.put(Thread.currentThread(), newValue); // ①键为线程对象,值为本线程的变量副本        }         public T get() {                Thread currentThread = Thread.currentThread();                T o = valueMap.get(currentThread); // ②返回本线程对应的变量                if (o == null && !valueMap.containsKey(currentThread)) { // ③如果在Map中不存在,放到Map中保存起来。                        o = initialValue();                        valueMap.put(currentThread, o);                }                return o;        }         public void remove() {                valueMap.remove(Thread.currentThread());        }         protected T initialValue() {                return null;        }}
实用ThreadLocal


    class Count {        private SimpleThreadLocal count = new SimpleThreadLocal() {                @Override                protected Integer initialValue() {                        return 0;                }        };         public Integer increase() {                count.set(count.get() + 1);                return count.get();        } } class TestThread implements Runnable {        private Count count;         public TestThread(Count count) {                this.count = count;        }         @Override        public void run() {                // TODO Auto-generated method stub                for (int i = 1; i <= 3; i++) {                        System.out.println(Thread.currentThread().getName() + "\t" + i                                        + "th\t" + count.increase());                }        }} public class TestThreadLocal {        public static void main(String[] args) {                Count count = new Count();                Thread t1 = new Thread(new TestThread(count));                Thread t2 = new Thread(new TestThread(count));                Thread t3 = new Thread(new TestThread(count));                Thread t4 = new Thread(new TestThread(count));                t1.start();                t2.start();                t3.start();                t4.start();        }}
输出
Thread-0 1th 1 Thread-0 2th 2 Thread-0 3th 3 Thread-3 1th 1 Thread-1 1th 1 Thread-1 2th 2 Thread-2 1th 1 Thread-1 3th 3 Thread-3 2th 2 Thread-3 3th 3 Thread-2 2th 2 Thread-2 3th 3


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋| 碧海潮声大学生网  

Copyright © 2001-2013 Comsenz Inc.   All Rights Reserved.

Powered by Discuz! X3.2( 浙ICP备11026473号 )

快速回复 返回顶部 返回列表