ThreadLocalTest
2015-08-26 17:19
471 查看
<pre name="code" class="java">package com.xianfeng.common.testThreadLocal; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Set; public class ThreadLocalTest { static ThreadLocal<List> lsit0 = new ThreadLocal<List>(){ @Override protected List initialValue() { System.out.println(Thread.currentThread().getName()+"initialValue"); return new ArrayList(); } }; public void run(){ Thread[] runs = new Thread[3]; T1 t=new T1(0); for(int i=0;i<runs.length;i++){ t.set(i); runs[i]=new Thread(t); } for(int i=0;i<runs.length;i++){ runs[i].start(); } } public static class T1 implements Runnable{ int id; public T1(int id0){ id = id0; } public void set(int i){ id=i; } // //List t1 = new ArrayList(); //①测试,出现数据错乱。说明变量 //ThreadLocal<List> t1=lsit0;//②测试 public void run() { System.out.println(Thread.currentThread().getName()+":start"); List t1 = new ArrayList(); //③测试,出现数据错乱。说明变量 for(int i=0;i<5;i++){ try{ if (Thread.currentThread().getName().equals("Thread-0")) { Thread.sleep(100); }else if(Thread.currentThread().getName().equals("Thread-1")) { Thread.sleep(300); }else { Thread.sleep(700); } }catch(Exception ex){ } t1.add(i+"=="+(i+id*100));//①③公用 //t1.get().add(i+"=="+(i+id*100)); //② } System.out.println(Thread.currentThread().getName()+':'+t1); //①③公用 //System.out.println(Thread.currentThread().getName()+':'+t1.get()); //② } } /** * Main * @param args */ public static void main(String[] args){ ThreadLocalTest test = new ThreadLocalTest(); test.run(); } }
先用①直接运行,(即运行代码①)再注释①用②测试,再注释①,②,用③代码测试。
①输出结果
Thread-1:start
Thread-2:start
Thread-0:[0==200, 1==201, 0==200, 2==202, 3==203, 4==204]
Thread-1:[0==200, 1==201, 0==200, 2==202, 3==203, 4==204, 1==201, 0==200, 2==202, 3==203, 1==201, 4==204]
Thread-2:[0==200, 1==201, 0==200, 2==202, 3==203, 4==204, 1==201, 0==200, 2==202, 3==203, 1==201, 4==204, 2==202, 3==203, 4==204]
②的输出结果
Thread-0:start
Thread-2:start
Thread-1:start
Thread-0initialValue
Thread-1initialValue
Thread-0:[0==200, 1==201, 2==202, 3==203, 4==204]
Thread-2initialValue
Thread-1:[0==200, 1==201, 2==202, 3==203, 4==204]
Thread-2:[0==200, 1==201, 2==202, 3==203, 4==204]
③的输出结果
Thread-0:start
Thread-1:start
Thread-2:start
Thread-0:[0==200, 1==201, 2==202, 3==203, 4==204]
Thread-1:[0==200, 1==201, 2==202, 3==203, 4==204]
Thread-2:[0==200, 1==201, 2==202, 3==203, 4==204]
①和②对比可以发现,除了ThreadLocal 变量 ,其他的变量 线程间都是共享的,因此线程间不是安全的数据,就需要将此数据装入到ThreadLocal 变量里。
②和③对比说明了什么?是不是就像在一个类中初始化了三个内部类,内部类可以共同操作外部类的变量,但内部类的变量是彼此独立(联想每个代码片段
都是有自己数据存储空间的,没求证过,可能现实就是这样。)
为了解决并发的问题,处理把不是线程安全的数据放入到ThreadLocal里,(以空间换时间,)还有就是把run()方法的代码加上锁(以空间换时间),这个线程不执行完成,其他线程
就等待,由于是一个类的多个线程,这个锁对象肯定就是一个了,一个线程的锁不释放,其他的线程就一直处理等待的状态。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统