20
2020
10

ThreadLocal使用的一般步骤

1、在多线程的类(如ThreadDemo类)中。创建一个ThreadLocal对象threadXxx,用来保存线程间须要隔离处理的对象xxx。

2、在ThreadDemo类中。创建一个获取要隔离访问的数据的方法getXxx(),在方法中推断,若ThreadLocal对象为null时候,应该new()一个隔离訪问类型的对象,并强制转换为要应用的类型。

3、在ThreadDemo类的run()方法中。通过getXxx()方法获取要操作的数据。这样能够保证每一个线程相应一个数据对象,在不论什么时刻都操作的是这个对象。


使用示例:


private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();


    public static void main(String[] args) {


        new Thread(() -> {

            try {

                for (int i = 0; i < 10; i++) {

                    threadLocal.set(i);

                    System.out.println(Thread.currentThread().getName() + " = " + threadLocal.get());

                    try {

                        Thread.sleep(200);

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                }

            } finally {

                threadLocal.remove();

            }

        }, "threadLocal test 1").start();



        new Thread(() -> {

            try {

                for (int i = 0; i < 10; i++) {

                    System.out.println(Thread.currentThread().getName() + " = " + threadLocal.get());

                    try {

                        Thread.sleep(200);

                    } catch (InterruptedException e) {

                        e.printStackTrace();

                    }

                }

            } finally {

                threadLocal.remove();

            }

        }, "threadLocal test 2").start();

    }


输出


threadLocal test 1 = 0

threadLocal test 2 = null

threadLocal test 2 = null

threadLocal test 1 = 1

threadLocal test 2 = null

threadLocal test 1 = 2

threadLocal test 2 = null

threadLocal test 1 = 3

threadLocal test 2 = null

threadLocal test 1 = 4

threadLocal test 2 = null

threadLocal test 1 = 5

threadLocal test 2 = null

threadLocal test 1 = 6

threadLocal test 2 = null

threadLocal test 1 = 7

threadLocal test 2 = null

threadLocal test 1 = 8

threadLocal test 2 = null

threadLocal test 1 = 9


与Synchonized的对照:


ThreadLocal和Synchonized都用于解决多线程并发访问。可是ThreadLocal与synchronized有本质的差别。synchronized是利用锁的机制,使变量或代码块在某一时该仅仅能被一个线程访问。而ThreadLocal为每个线程都提供了变量的副本,使得每个线程在某一时间访问到的并非同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通信时可以获得数据共享。


Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。