JAVA多线程变量的深入认识(三)
2014-08-21 21:26
183 查看
现在的问题来了,当我们关注例子I,希望共享类RunInstance,即
RunInstance t = new RunInstance();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
却又要对变量进行线程单独化的管理时,怎么办?这时候就有了ThreadLocal。请看
例子III
首先我们对类TestInstance做一下改造,也就是把Flag变成ThreadLocal,即线程的独自变量
改造如下1,2,3点,接着我们仍旧运行例子I
class TestInstance {
static Integer count = 0;
//1: public int flag = 0;
public ThreadLocal flag = new ThreadLocal(){
public Integer initialValue(){
return 0;
}
};
public void runtest(){
//2: if (flag ==0)m1();
if (flag.get() ==0)m1();
else m2();
}
public void m1(){
//3. flag=1;
flag.set(1);
synchronized(count){
for(int i = 0;i < 10; i++){
count++;
System.out.println(Thread.currentThread().getName()+": m1's printing : count = "+count);
}
}
}
public void m2(){
synchronized(count){
for(int i = 0;i < 10; i++){
count++;
System.out.println(Thread.currentThread().getName()+": m2's printing : count = "+count);
}
}
}
}
却发现结果发生了变化。两个线程都只执行了m1,也就是说flag是
线程独立的。
Thread-0: m1's printing : count = 2
Thread-1: m1's printing : count = 2
Thread-0: m1's printing : count = 3
Thread-1: m1's printing : count = 4
Thread-0: m1's printing : count = 5
Thread-1: m1's printing : count = 6
Thread-0: m1's printing : count = 7
Thread-1: m1's printing : count = 8
Thread-0: m1's printing : count = 9
Thread-1: m1's printing : count = 10
Thread-0: m1's printing : count = 11
Thread-1: m1's printing : count = 12
Thread-0: m1's printing : count = 13
Thread-1: m1's printing : count = 14
Thread-0: m1's printing : count = 15
Thread-1: m1's printing : count = 16
Thread-0: m1's printing : count = 17
Thread-1: m1's printing : count = 18
Thread-0: m1's printing : count = 19
Thread-1: m1's printing : count = 20
RunInstance t = new RunInstance();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
却又要对变量进行线程单独化的管理时,怎么办?这时候就有了ThreadLocal。请看
例子III
首先我们对类TestInstance做一下改造,也就是把Flag变成ThreadLocal,即线程的独自变量
改造如下1,2,3点,接着我们仍旧运行例子I
class TestInstance {
static Integer count = 0;
//1: public int flag = 0;
public ThreadLocal flag = new ThreadLocal(){
public Integer initialValue(){
return 0;
}
};
public void runtest(){
//2: if (flag ==0)m1();
if (flag.get() ==0)m1();
else m2();
}
public void m1(){
//3. flag=1;
flag.set(1);
synchronized(count){
for(int i = 0;i < 10; i++){
count++;
System.out.println(Thread.currentThread().getName()+": m1's printing : count = "+count);
}
}
}
public void m2(){
synchronized(count){
for(int i = 0;i < 10; i++){
count++;
System.out.println(Thread.currentThread().getName()+": m2's printing : count = "+count);
}
}
}
}
却发现结果发生了变化。两个线程都只执行了m1,也就是说flag是
线程独立的。
Thread-0: m1's printing : count = 2
Thread-1: m1's printing : count = 2
Thread-0: m1's printing : count = 3
Thread-1: m1's printing : count = 4
Thread-0: m1's printing : count = 5
Thread-1: m1's printing : count = 6
Thread-0: m1's printing : count = 7
Thread-1: m1's printing : count = 8
Thread-0: m1's printing : count = 9
Thread-1: m1's printing : count = 10
Thread-0: m1's printing : count = 11
Thread-1: m1's printing : count = 12
Thread-0: m1's printing : count = 13
Thread-1: m1's printing : count = 14
Thread-0: m1's printing : count = 15
Thread-1: m1's printing : count = 16
Thread-0: m1's printing : count = 17
Thread-1: m1's printing : count = 18
Thread-0: m1's printing : count = 19
Thread-1: m1's printing : count = 20
相关文章推荐
- JAVA多线程变量的深入认识(二)
- JAVA多线程变量的深入认识(一)
- Java中,对多线程访问同一变量(并发访问)的认识
- Java多线程(一)之volatile深入分析
- 初学Java多线程:使用Synchronized块同步变量
- Java多线程 -- 深入理解JMM(Java内存模型) --(三)顺序一致性
- 认识Java多线程
- 全面深入认识C变量
- Java多线程(六)之Deque与LinkedBlockingDeque深入分析
- java多线程学习2-线程栈模型与线程的变量
- 对Java方法内部使用this访问成员变量的深入理解
- JavaWeb开发深入认识并创建XML文件之一
- Java: 简单模拟多线程访问同样变量导致的问题
- Java多线程(一)之volatile深入分析
- Java多线程(四)之ConcurrentSkipListMap深入分析
- 初学Java多线程:使用Synchronized块同步变量
- [Java 多线程] 变量可见性
- Java多线程 -- 深入理解JMM(Java内存模型) --(一)基础
- Java多线程 -- 深入理解JMM(Java内存模型) --(五)锁
- 深入理解Java的环境变量配置