Java -- Thread -- Collection -- 5线程范围内共享变量的概念与作用
线程范围内共享数据图解:

代码演示:
class ThreadScopeShareData { //三个模块共享数据,主线程模块和AB模块 private static int data = 0; //准备共享的数据 //存放各个线程对应的数据 private Map<Thread, Integer> threadData = new HashMap<Thread, Integer>(); public static void main(String[] args) { //创建两个线程 for (int i=0; i<2; i++) { new Thread( new Runnable() { public void run() { //现在当前线程中修改一下数据,给出修改信息 data = new Random().nextInt(); SOP(Thread.currentThread().getName()+将数据改为+data); //将线程信息和对应数据存储起来 threadData.put(Thread.currentThread(), data); //使用两个不同的模块操作这个数据,看结果 new A().get(); new B().get(); } } ).start(); } } static class A { public void get() { data = threadData.get(Thread.currentThread()); SOP(A+Thread.currentThread().getName()+拿到的数据+data); } } static class B { public void get() { data = threadData.get(Thread.currentThread()); SOP(B+Thread.currentThread().getName()+拿到的数据+data); } } }
结果并没与实现线程间的数据同步,两个线程使用的是同一个线程的数据。要解决这个问题,可以将每个线程用到的数据与对应的线程号存放到一个map集合中,使用数据时从这个集合中根据线程号获取对应线程的数据。代码实现:上面红色部分

程序中存在的问题:获取的数据与设置的数据不同步
Thread-1共享数据设置为:-997057737
Thread-1--A 模块数据:-997057737
Thread-0共享数据设置为:11858818
Thread-0--A 模块数据:11858818
Thread-0--B 模块数据:-997057737
Thread-1--B 模块数据:-997057737
最好将Runnable中设置数据的方法也写在对应的模块中,与获取数据模块互斥,以保证数据同步
holder
浙公网安备 33010602011771号