ThreadLocal 学习

1.list参数问题(无warnnings)

public static void main(String[] args){
List<Object> list=new ArrayList<Object>();
list.add("ABDC");
list.add(1);
list.add(new Thread());
for(Object obj:list)System.out.println(obj);

打印结果:

  ABDC
  1
  Thread[Thread-0,5,main]

 

public String toString() {
ThreadGroup group = getThreadGroup();
if (group != null) {
return "Thread[" + getName() + "," + getPriority() + "," +
group.getName() + "]";
} else {
return "Thread[" + getName() + "," + getPriority() + "," +
"" + "]";
}
}

 

2.list参数问题(有 warnnings)

public static void main(String[] args){
List list=new ArrayList();
list.add("ABDC");
list.add(1);
list.add(new Thread());
for(Object obj:list)System.out.println(obj);

打印结果:

  ABDC

  1

  Thread[Thread-0,5,main]

warnnings:list是需要有参数的

3.ThreadLocal的同步机制

threadLocal和线程的同步这两种方式都用来解决多线程共享变量冲突问题

1)线程的同步是采用“以时间来换空间”的方式,锁的机制

2)ThreadLocal是采用“以空间来换时间”的方式,共享变量副本

hreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。

ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。比如书HashMap就是不安全的。

4.ThreadLocal的接口方法

  • void set(Object value)设置当前线程的线程局部变量的值。
  • public Object get()该方法返回当前线程所对应的线程局部变量。
  • public void remove()将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。
  • protected Object initialValue()返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null

 例子:

   public static void a1(int a) {
        a2(a);
    }
    public static void a2(int a) {
        a3(a + 100);
    }
    public static void a3(int a) {
        a4(a + 200);
    }
    public static void a4(int a) {
        System.out.println(a + 300);
    }
    public static void  main(String[] args) {
        a1(100);
    }
a1,a2,a3,a4都要定义一个参数用来接收输入参数 
 
 能不能通过ThreadLocal将a2,a3,a4改成无参的函数,使代码功能不变》

 

  private static ThreadLocal<Integer> PARAM = new ThreadLocal<Integer>() {
        @Override
        protected Integer  initialValue() {
          return 0;
        }
    };

    public static void a1(int a) {
        PARAM.set(a + 100);
        a2();
    }
    public static void a2() {
        PARAM.set(PARAM.get() + 200);
        a3();
    }
    public static void a3() {
        PARAM.set(PARAM.get() + 300);
        a4();
    }
    public static void a4() {
        System.out.println(PARAM.get());
    }
    public static void  main(String[] args) {
        a1(100);
    }
 

  ThreadLocal是保证变量是安全的

就想是乐观锁一样

 

posted @ 2015-10-14 15:34  我在途中  阅读(347)  评论(0编辑  收藏  举报