zoukankan      html  css  js  c++  java
  • ThreadLocal

    如果线程都调用同一个类的数据,会导致数据错误,ThreadLocal用来提供线程内部的共享变量,在多线程环境下,可以保证各个线程之间的变量互相隔离、相互独立。

    如果有一个类的某个变量会被不同的进程调用,就必须将这个变量设置成ThreadLocal类型 

    ThreadLocal一般会加泛型,实例化对象一般有两种方:

    第一种方式变量的初始值为null,第二种方式可以给设置的变量赋初始值

     static ThreadLocal<Integer> variable = new ThreadLocal<Integer>();
            static ThreadLocal<Integer> variable = new ThreadLocal<Integer>(){
            @Override
            protected Integer initialValue() {
                return 1;
            }
        };

    常用的方法有四个:

      T=initialValue()  返回此线程局部变量的当前线程的“初始值”。一般不调用set方法第一次调用get的方法的时候回自动调用活得初始值,二般是调用remove以后第一次调用get的时候。

      T=get()    返回当前线程的此线程局部变量副本中的值  

      void=set() 将此线程局部变量设置为指定值

      void=remove()  删除此线程局部变量的当前线程值。

    public class TortoiseRun extends Thread {
    //    static ThreadLocal<Integer> step = new ThreadLocal<Integer>();
        static ThreadLocal<Integer> step = new ThreadLocal<Integer>(){
        @Override
            protected Integer initialValue() {
            return 1;
            }
        };
        public TortoiseRun(){};
        public TortoiseRun(String name){
            super(name);
        };
        @Override
        public void run(){
            for (int i = 1; i <10; i++) {
                try {
                    Thread.currentThread().sleep(1000);
                    step.set(i);
                    System.out.println(Thread.currentThread().getName()+"走了"+step.get());
    
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
            }
        }
    
    }
    public class TestMain {
        public static void main(String[] args) {
            TortoiseRun tortoiserun1=new TortoiseRun("乌龟1");
            TortoiseRun tortoiserun2=new TortoiseRun("乌龟2");
            tortoiserun1.start();
            try {
                Thread.currentThread().sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            tortoiserun2.start();
    
        }
    }
  • 相关阅读:
    安卓使用socket建立通信客户端不显示数据
    使用bmob后端云中listview如何实现数据显示在第一个item
    安卓如何实现点击一个按钮退出整个程序?
    Python安装与准备
    敏感度——区分平庸和伟大
    fragment中设置点击事件(onclick)使用intent进行通信
    listview的几种简单用法
    Android开发现在是不是该学?
    数据包重放
    Sql注入一种dump所有数据的方法
  • 原文地址:https://www.cnblogs.com/ysmdbk/p/11237444.html
Copyright © 2011-2022 走看看