在日常的开发中,都会遇到以下多线程的问题:
1、一个线程操作读取到另外一个线程的数据。
2、在同一个线程之内,多个方法读取到的同一个数据不一样
小编就曾遇到过,开启多个线程的时候,线程之间的数据传递出现串行的情况。下面是一个简单的demo。
import java.io.DataOutputStream; import java.util.Random; import org.junit.Test; /** * 数据在线程内共享,线程间互斥 * */ public class App { private static ThreadLocal<Integer> td = new ThreadLocal<Integer>(); @Test public void test() { for (int i = 0; i < 3; i++) { new Thread(new Runnable() { @Override public void run() { int data = new Random().nextInt(); td.set(data); new A().get(); new B().get(); } }).start(); } } //A类,用来调用该线程 class A { public void get() { int object = td.get(); System.out.println("A+" + Thread.currentThread() + ":" + object); } } //B类,用来调用该线程 class B { public void get() { int object = td.get(); System.out.println("B+" + Thread.currentThread() + ":" + object); } } }
循环开启3个不同的线程 Thread-0、Thread-1、Thread-2。每个线程中随机一个不同的data数据。class A 和class B中各有一个方法,分别读取三个线程中的数据。运行的结果是:
A+Thread[Thread-2,5,main]:314526773 A+Thread[Thread-1,5,main]:-1486854959 B+Thread[Thread-2,5,main]:314526773 B+Thread[Thread-1,5,main]:-1486854959 A+Thread[Thread-0,5,main]:2096144247 B+Thread[Thread-0,5,main]:2096144247
可以看出class A 和class B同时去读取线程Thread-0的时候,读取到的值是一样的。同理读取另外两个线程的时候也是一样的,实现了多个对象同时去取一个线程里面的数据,这个数据是可以共享不变的。new了一个ThreadLocal对象,表明将数据存入当前线程,与其他线程不能获取这个数据,实现多个线程间数据的互斥。
ThreadLocal的应用场景,可能大家会说上面的demo中,ThreadLocal对象是用来线程内传值的。准确的说每个线程分配一个只属于该线程的ThreadLocal对象,其他线程操作不了封装入这个ThreadLocal对象的数据,说通俗点就是为了增强线程的安全性,为了实现线程间的数据隔离。
希望对初学者有帮助,如果有其他好的方法,请大家踊跃指出~v~