JAVA并发编程7_线程封闭:ThreadLocal类
2015-08-26 12:00
411 查看
多线程访问共享数据时,通常需要同步,一种避免使用同步的方式就是不共享数据。如果仅在单线程里访问数据,那么就不需要使用同步,这种技术被称为线程封闭。
Ad-hoc线程封闭:维护线程封闭性的职责完全由程序实现来承担。
栈封闭:我的理解就是局部变量,局部变量是线程私有的,不会被共享,也就不存在竞争问题。因此能使用局部变量的地方就不要使用全局变量。
ThreadLocal类:一种维护线程封闭性更规范的方法。顾名思义就是创建一个线程局部变量。它会为使用相同变量的每个不同线程都创建不同存储。我的理解是在使用全局的变量(多线程均可能同时访问的变量)的前提下,多个线程同时去访问该变量,一般会出现线程不安全,而此时我们又不需要共享该变量,就可以使用ThreadLocal类来解决。
实际上,ThreadLocal根本就不是解决共享变量的问题,线程之间根本就不会共享变量,一定要注意ThreadLocal是用来隔离线程存储数据的。
程序运行时,很显然每个线程都被分配了自己的存储。如果不是使用ThreadLocal类,那这五个线程共享的是num变量,必然会产生线程不安全产生竞争。
Ad-hoc线程封闭:维护线程封闭性的职责完全由程序实现来承担。
栈封闭:我的理解就是局部变量,局部变量是线程私有的,不会被共享,也就不存在竞争问题。因此能使用局部变量的地方就不要使用全局变量。
ThreadLocal类:一种维护线程封闭性更规范的方法。顾名思义就是创建一个线程局部变量。它会为使用相同变量的每个不同线程都创建不同存储。我的理解是在使用全局的变量(多线程均可能同时访问的变量)的前提下,多个线程同时去访问该变量,一般会出现线程不安全,而此时我们又不需要共享该变量,就可以使用ThreadLocal类来解决。
实际上,ThreadLocal根本就不是解决共享变量的问题,线程之间根本就不会共享变量,一定要注意ThreadLocal是用来隔离线程存储数据的。
public class Test implements Runnable{ private ThreadLocal<Integer> num = new ThreadLocal<Integer>(){ protected Integer initialValue() { return 100; }; }; @Override public void run() { while (!Thread.currentThread().isInterrupted()) { increment(); System.out.println(Thread.currentThread().getName() + " " + num.get()); Thread.yield(); } } private void increment() { num.set(num.get() + 1); } public static void main(String[] args) throws InterruptedException { Test test = new Test(); ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < 5; i++) { exec.execute(test); } TimeUnit.MILLISECONDS.sleep(5); exec.shutdownNow(); } }输出
pool-1-thread-2 101 pool-1-thread-1 101 pool-1-thread-4 101 pool-1-thread-3 101 pool-1-thread-5 101 pool-1-thread-4 102 pool-1-thread-1 102 pool-1-thread-3 102 pool-1-thread-2 102 pool-1-thread-5 102 pool-1-thread-1 103 pool-1-thread-4 103 pool-1-thread-3 103 pool-1-thread-2 103 pool-1-thread-5 103 pool-1-thread-1 104 pool-1-thread-4 104 pool-1-thread-3 104 pool-1-thread-2 104 pool-1-thread-5 104 …
程序运行时,很显然每个线程都被分配了自己的存储。如果不是使用ThreadLocal类,那这五个线程共享的是num变量,必然会产生线程不安全产生竞争。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python3写爬虫(四)多线程实现数据爬取
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树