zoukankan      html  css  js  c++  java
  • 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是保证变量是安全的

    就想是乐观锁一样

     

  • 相关阅读:
    行为型模式之 命令模式
    结构型模式之 代理模式
    oop编程思想
    2013应届毕业生各大IT公司待遇整理汇总篇(转)
    python定义class
    python——博客园首页信息提取与分析(转载有改动)
    深入浅出TCP/IP协议
    python基础之socket
    python基础
    c++stl之stack
  • 原文地址:https://www.cnblogs.com/zhengtu2015/p/4877411.html
Copyright © 2011-2022 走看看