线程局部变量的使用ThreadLocal和其底层原理

/*ThreadLocal类: 
 * 该类提供了线程局部变量,它是一个池 Map<Thread.currentThread,locObj>,
 * 池中为每个线程保存一个独立的局部变量,
 * 每个线程可以从这个池中读取或设置自己的局部变量。

//底层就是一个map,用线程中的Thread.currentThread()作为识别的key,当前线程是一样的则拿到的value也是相同的。

所以可以跨类使用该变量,长使用在数据库连接池中方便事务的处理,让在不同dao中处理的事务可以共享一个Connection,做到事务的一致性
 */
public class ThreadLocalDemo {
    
    //线程局部变量池
    //private static ThreadLocal<Object> t = new ThreadLocal<Object>();
    private static MyThreadLocal<Object> t = new MyThreadLocal<Object>();
    
    public static Object getValue(){
        //System.out.println(Thread.currentThread());
        Object obj = t.get();
        if(obj==null){
            System.out.println("没有....");
            Random r = new Random();
            obj = r.nextInt(100);
            t.set(obj);
        }
        return obj;
    }
    
}

////////////////////////////////////////////////////////////////////////////////////自己做一个ThreadLocal的主要功能的类////////////////////////////////

//底层就是一个map,用线程中的Thread.currentThread()作为识别的key,当前线程是一样的则拿到的value也是相同的。
public class MyThreadLocal<T> {
    private Map<Thread, Object> map = new HashMap<Thread, Object>();
    public Object get(){
        Thread curThread = Thread.currentThread();
        return  map.get(curThread);
    }
    public void set(Object obj){
        Thread curThread = Thread.currentThread();
        map.put(curThread, obj);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35307947/article/details/82813221
今日推荐