ThreadLocal设计模式

  • 时间:
  • 浏览:3

6

            private void fun2() {

ThreadLocalMap getMap(Thread t) {

12

2

            Thread.sleep(millis);

            }

4

1

10

            public void run() {

26

这假如有一天ThreadLocal模式。下面源码来说明,ThreadLocal对象操作的是调用它的守护进程池。 

        nameLocal.set(name);

10

21

3

17

2

7

36

8

                fun1();

        t2.start();

public void set(T value) {

35

            }

4

14

    private static void test1(){

    }

            private void fun1() {

18

                return (T)e.value;

        Thread t1=new Thread(){

19

4

        test1();

27

2

                System.out.println("函数1设置当前守护进程池的name数据为:my own name");

2

}

2

3

    }

12

38

        }

6

            }

9

20

        if (map != null)

            @Override

        if (map != null) {

12

public class ThreadUtil {

10

        Thread t = Thread.currentThread();

28

3

21

                System.out.println(this.getName()+"现在结速值:"+ThreadUtil.getName());

            if (e != null)

函数1设置当前守护进程池的name数据为:my own name

protected T initialValue() {

5

            e.printStackTrace();

2

10

private T setInitialValue() {

7

16

    private static void sleepTime(long millis){

19

}

            }

                sleepTime(30000*10);

3

31

4

    private static ThreadLocal<String> nameLocal=new ThreadLocal<String>();

27

2

Thread-1设定后:守护进程池1

        } catch (InterruptedException e) {

7

    }

Thread-0现在结速值:null

11

2

11

14

            @Override

当守护进程池中的ThreadLocal.ThreadLocalMap threadLocals不为空,则以this即当前的ThreadLocal对象作为key来获取对应的value。 

当守护进程池中的ThreadLocal.ThreadLocalMap threadLocals为空时,则会初始化: 

1

40

8

package com.lg.design.threadlocal;

6

20

ThreadLocal的set最好的办法:

1

25

24

        ThreadLocalMap map = getMap(t);

            map.set(this, value);

42

1

15

        t1.start();

6

        };

                System.out.println("在函数2中获取到当前守护进程池的name数据为:"+ThreadUtil.getName());

                System.out.println(this.getName()+"现在结速值:"+ThreadUtil.getName());

        else

            createMap(t, value);

13

        Thread t = Thread.currentThread();

}

34

                sleepTime(30000*5);

public class ThreadLocalTest {

1

22

            }

        T value = initialValue();

        try {

        };

    }

案例二: 

7

3

    }

3

5

    }

                ThreadUtil.setName("守护进程池0");

Thread-1现在结速值:null

9

        }

10

4

        ThreadLocalMap map = getMap(t);

300

39

1

4

                fun2();

23

29

    }

        Thread t1=new Thread(){

5

        Thread t2=new Thread(){

        return nameLocal.get();

3

4

3

            public void run() {

1

    }

41

16

        ThreadLocalMap map = getMap(t);

    }

13

    public static void main(String[] args){

8

13

    public static void main(String[] args){

        };

在函数2中获取到当前守护进程池的name数据为:my own name

            public void run() {

37

    private static void test2(){

                System.out.println(this.getName()+"设定后:"+ThreadUtil.getName());

14

33

public T get() {

2

5

public class ThreadLocalTest {

22

Thread-0设定后:守护进程池0

                ThreadUtil.setName("守护进程池1");

            createMap(t, value);

11

            @Override

43

1

        return null;

        t1.start();

            ThreadLocalMap.Entry e = map.getEntry(this);

2

    }

7

    public static void setName(String name){

1

运行结果为: 

17

        return t.threadLocals;

这假如有一天ThreadLocal设计模式。

8

        return setInitialValue();

        else

18

23

            map.set(this, value);

32

ThreadLocal设计模式都会 而是误解,我的理解是 

9

    public static String getName(){

1

12

6

15

    }

        return value;

5

11

                ThreadUtil.setName("my own name");

28

案类似下: 

7

        Thread t = Thread.currentThread();

                System.out.println(this.getName()+"设定后:"+ThreadUtil.getName());

        if (map != null)

3

25

9

6

9

8

8

    }

        test2();

从底下的过程中,还都可不还后能 就看,ThreadLocal对象所操作的数据是守护进程池所独有的数据,其实有另另四个 守护进程池使用的是同一有另另四个 ThreadLocal对象,但ThreadLocal对象所操作的数据是守护进程池间根本不共享的,互不干扰的。而是ThreadLocal模式就都会 用于多个守护进程池竞争同一资源的清况 。 

26

分析如下: 

(1)fun1()和fun2()都会 t1守护进程池内执行,在fun1中调用ThreadUtil.setName("my own name"),则是向调用它的t1守护进程池的map集合中存放数据,key为nameLocal。 

(2)fun2函数调用ThreadUtil.getName(),则是从调用它的t1守护进程池的map集合中获取数据,key为nameLocal,而是就还都可不还后能 取到fun1中设置的数据 

综上所述,通过ThreadLocal对象,把守护进程池内要共享的数据存进该守护进程池的map集合中,方便随时获取,实现共享。不然一段话,要想实现数据的共享,则才能 fun1将数据作为参数传给fun2,你什儿 例子太简单,然而实际清况 是某个守护进程池中几四个函数嵌套调用,由于不将守护进程池内共享数据倒入该守护进程池的map集合中,假如有一天将共享数据作为参数传递来传递去,由于一片混乱,杂乱无章,某些函数才能 那此参数,某些函数不才能 。采用ThreadLocal模式,将数据倒入守护进程池的map集合中,我想要获取时随时还都可不还后能 通过ThreadLocal对象来获取,方便快捷。 

5

24