ThreadLocal类本人理解是修饰变量的,控制变量的作用域,初衷是为了让变量的种类变的丰富,不是为了解决线程并发和线程冲突的。
根据变量的作用域:全局变量、局部变量。简单的说,类里面定义的变量是全局变量,函数里面定义的变量是局部变量。
在几个函数之间共用一个变量,出现了线程变量,这种变量在Java中就是ThreadLocal变量。全局变量,范围很大;局部变量,范围很小。无论是大还是小,其实都是定死的。而线程变量作用域关键在于线程调用几个函数,在这几个函数中去共享变量。
具体如下:
1、ThreadLocal.get:获取ThreadLocal中当前线程共享变量的值。
2、ThreadLocal.set:设置ThreadLocal中当前线程共享变量的值。
3、ThreadLocal.remove:移除ThreadLocal中当前线程共享变量的值。
4、ThreadLocal.initialValue:ThreadLocal没有被当前线程赋值时或当前线程刚调用remove方法后调用get方法,返回此方法值。
/**
* @Description:ThreadLocal的用法
* @Date 2019-04-01
* @Author:xml
*/
public class ThreadLocalTest {
private static finalThreadLocal<Object> msgLocal = new ThreadLocal<Object>();//线程变量
public static Object get() {
return msgLocal.get();
}
public static void set(Objectmsg) {
msgLocal.set(msg);
}
public static void clear() {
msgLocal.remove();
}
public static void main(String[]args)
{
new Thread(newIntegerTask("整数线程")).start();
new Thread(newStringTask("字符线程")).start();
}
public static class StringTaskimplements Runnable
{
private String name;//全局变量
StringTask(String name)
{
this.name = name;
}
@Override
public void run()
{
for(int i = 0; i < 6;i++)
{
if(null ==ThreadLocalTest.get())
{
ThreadLocalTest.set("B");
System.out.println(name + ": B");
}
else
{
String str =(String)ThreadLocalTest.get();
ThreadLocalTest.set(str + "B");
System.out.println(name + ": " + ThreadLocalTest.get());
if (i == 4) {
ThreadLocalTest.clear();
}
}
try
{
Thread.sleep(500);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
public static class IntegerTaskimplements Runnable
{
private String name;
IntegerTask(String name)
{
this.name = name;
}
@Override
public void run()
{
for(int i = 0; i < 6;i++)
{
// ThreadLocal.get方法获取线程变量
if(null ==ThreadLocalTest.get())
{
//ThreadLocal.set方法设置线程变量
ThreadLocalTest.set(0);
System.out.println(name + ": 0");
}
else
{
int num =(Integer)ThreadLocalTest.get();
ThreadLocalTest.set(num + 1);
System.out.println(name + ": " + ThreadLocalTest.get());
if (i == 3) {
ThreadLocalTest.clear();
}
}
try
{
Thread.sleep(800);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
总结,ThreadLocal类是修饰变量的,是在控制它的作用域,是为了增加变量的种类而已,这才是ThreadLocal类诞生的初衷,它的初衷可不是解决线程冲突的。
关注我们,精彩属于你





