暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ThreadLocal理解

NIU技术那点事 2019-04-17
230

ThreadLocal类本人理解是修饰变量的,控制变量的作用域,初衷是为了让变量的种类变的丰富,不是为了解决线程并发和线程冲突的。

根据变量的作用域:全局变量、局部变量。简单的说,类里面定义的变量是全局变量,函数里面定义的变量是局部变量。

在几个函数之间共用一个变量,出现了线程变量,这种变量在Java中就是ThreadLocal变量。全局变量,范围很大;局部变量,范围很小。无论是大还是小,其实都是定死的。而线程变量作用域关键在于线程调用几个函数,在这几个函数中去共享变量。

具体如下:

1ThreadLocal.get:获取ThreadLocal中当前线程共享变量的值。

2ThreadLocal.set:设置ThreadLocal中当前线程共享变量的值。

3ThreadLocal.remove:移除ThreadLocal中当前线程共享变量的值。

4ThreadLocal.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类诞生的初衷,它的初衷可不是解决线程冲突的。



关注我们,精彩属于你


文章转载自NIU技术那点事,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论