ThreadLocal简单实现

多线程控制类:

ThreadLocal:

用于多个线程需要用到同一个变量,但是每个线程对于这个变量的具体值又不一样,所以利用ThreadLocal.initialValue()可以创建副本(即变量的副本),这样每次用的都是同一个变量,但是数值的定义却互不影响,由具体线程决定,因为用的是针对每个线程创建的副本

方法:

  • protected T initialValue():
    返回此线程局部变量的当前线程的“初始值”(创建一个副本并且返回副本的初始值)。
  • get() :
    返回当前线程的此线程局部变量的副本中的值。
  • set(T value) :
    将当前线程的此线程局部变量的副本设置为指定的值。

创建一个可以实现转账的类:

public class OneThreadLocal {
    ThreadLocal<Integer> threadLocal=new ThreadLocal<Integer>(){
        @Override
        protected Integer initialValue() {
            return 0;
        }
    };
    public Integer get(){
        return threadLocal.get();
    }
    public void set(int money){
        threadLocal.set(threadLocal.get()+money);
    }
}

创建Runnable的实现类:

public class RunnableImpl implements Runnable{
    private OneThreadLocal oneThreadLocal=new OneThreadLocal();
    private int money;
    public RunnableImpl(int money){
        this.money=money;
    }
    @Override
    public void run() {
            oneThreadLocal.set(money);
        System.out.println("线程"+Thread.currentThread().getName()+"....."+oneThreadLocal.get());
    }
}

测试类:

创建10 个线程,对其进行set调用,观察每个线程是否互相干扰

import one.RunnableImpl;

public class OneThreadLocalTest {
    public static void main(String[] args) {
        for (int i=0;i<10;i++){
            RunnableImpl runnable=new RunnableImpl(10);
            Thread thread=new Thread(runnable);
            thread.start();
        }
    }
}

结果:

线程Thread-0.....10
线程Thread-2.....10
线程Thread-1.....10
线程Thread-3.....10
线程Thread-5.....10
线程Thread-6.....10
线程Thread-7.....10
线程Thread-8.....10
线程Thread-9.....10
线程Thread-4.....10

Process finished with exit code 0

结果可以得知,每个线程对数值的操作都是互相独立的,不会因为上一个线程加了10,下一个线程加10后就变成了20,他们可以操作的变量都相同,但本质是对利用变量ThreadLocal创建的副本进行操作,所以,才不会互相影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值