java多线程——ThreadLocal实现线程内的共享,和线程间的互斥

 
 

在日常的开发中,都会遇到以下多线程的问题:

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~

猜你喜欢

转载自blog.csdn.net/wiliam_mountain/article/details/80610787