Android多线程研究(6)——多线程之间数据隔离
来源:互联网 发布:机票数据出售 编辑:程序博客网 时间:2024/05/28 11:48
在上一篇《Android多线程研究(5)——线程之间共享数据》中对线程之间的数据共享进行了学习和研究,这一篇我们来看看如何解决多个线程之间的数据隔离问题,什么是数据隔离呢?比如说我们现在开启了两个线程,这两个线程都要同时给同一个全局变量data赋值,各个线程操作它赋值后的变量数据,这里就需要用到隔离。先看一段代码:
import java.util.Random;public class ThreadLocalTest {private static int data = 0;public static void main(String[] args) {for(int i=0; i<2; i++){new Thread(new Runnable() {@Overridepublic void run() {data = new Random().nextInt();System.out.println(Thread.currentThread().getName() +" has put data: " + data);new A().get();new B().get();}}).start();}}static class A{public int get(){System.out.println("A from " + Thread.currentThread().getName() +" has get data: " + data);return data;}}static class B{public int get(){System.out.println("B from " + Thread.currentThread().getName() +" has get data: " + data);return data;}}}运行结果:
从上面我们可以看到Thread-0和Thread-1都在操作变量data,但是两个线程之间没有做到对数据操作的隔离,所以输出结果中两个线程共用了一个data变量。
我们将上面代码修改如下:
import java.util.HashMap;import java.util.Map;import java.util.Random;public class ThreadLocalTest {//private static int data = 0;private static Map<Thread, Integer> map = new HashMap<Thread, Integer>();public static void main(String[] args) {for(int i=0; i<2; i++){new Thread(new Runnable() {@Overridepublic void run() {//data = new Random().nextInt();int data = new Random().nextInt();map.put(Thread.currentThread(), data);System.out.println(Thread.currentThread().getName() +" has put data: " + data);new A().get();new B().get();}}).start();}}static class A{public int get(){System.out.println("A from " + Thread.currentThread().getName() +" has get data: " + map.get(Thread.currentThread()));return map.get(Thread.currentThread());}}static class B{public int get(){System.out.println("B from " + Thread.currentThread().getName() +" has get data: " + map.get(Thread.currentThread()));return map.get(Thread.currentThread());}}}输出结果:
上面代码中我们用一个Map集合隔离了线程对data数据的操作,其实相当于创建了一个data数据的备份(双份的data)实现了线程之间数据的隔离,其实早在Java 1.2就引入了一个用来支持线程数据隔离的类(java.lang.ThreadLocal),下面我们来看看如何使用ThreadLocal实现线程之间的数据隔离。
ThreadLocal中的三个方法:‘
get() :返回当前线程的线程局部变量副本
protected initialValue() :返回该线程局部变量的当前线程的初始值
void set(Object value) :设置当前线程的线程局部变量副本的值
其中initialValue方法是为子类写的方法,在一个线程第一次调用get()或者set()方法时执行,并且仅执行一次。
import java.util.Random;public class ThreadLocalTest {//private static int data = 0;//private static Map<Thread, Integer> map = new HashMap<Thread, Integer>();private static ThreadLocal<Integer> tl = new ThreadLocal<Integer>();public static void main(String[] args) {for(int i=0; i<2; i++){new Thread(new Runnable() {@Overridepublic void run() {//data = new Random().nextInt();int data = new Random().nextInt();//map.put(Thread.currentThread(), data);tl.set(data);System.out.println(Thread.currentThread().getName() +" has put data: " + data);new A().get();new B().get();}}).start();}}static class A{public int get(){System.out.println("A from " + Thread.currentThread().getName() +" has get data: " + tl.get());return tl.get();}}static class B{public int get(){System.out.println("B from " + Thread.currentThread().getName() +" has get data: " + tl.get());return tl.get();}}}运行结果:
上面代码明显少了很多,其实ThreadLocal中底层也是用Map来存储变量副本实现的。
10 0
- Android多线程研究(6)——多线程之间数据隔离
- Android多线程研究(5)——线程之间共享数据
- Java多线程数据隔离(ThreadLocal)
- Java多线程总结(4)— 线程范围内数据操作的隔离及ThreadLocal类
- Android多线程研究(2)——定时器
- Android多线程研究(9)——线程锁Lock
- Android多线程研究(9)——读写锁
- Android多线程研究(9)——线程锁Lock
- Android多线程研究(1)——线程基础及源码剖析
- Android多线程研究(3)——线程同步和互斥及死锁
- Android多线程研究(4)——从一道面试题说起
- Android多线程研究(7)——Java5中的线程并发库
- Android多线程研究(8)——Java5中Futrue获取线程返回结果
- Android多线程研究(8)——Java中的原子性理解
- iOS多线程的初步研究(九)— dispatch源
- Android 多线程数据加载
- Android——多线程
- java基础——多线程之间通信
- SWTBOK测试实践系列(5) -- 项目中使用手动和自动化的策略
- JAVA中extends与implements详解
- 设计模式--创建型模式
- C语言 inf和nan
- oracle中的初始化参数文件
- Android多线程研究(6)——多线程之间数据隔离
- RadioButton的setTextColor失效!
- 搭建Android+服务端SSH框架
- 【数据结构】第三周研讨题
- Andrid UI--ActionBar的基本使用
- group by分组后,取每组的前几行
- SWIFT -计算机编程语言 资料大合集
- java JSP九大隐式对象
- SMART原则