Thread-Sepecific Storage

Thread-SpecificStorage

Thread-SpecificStorage Pattern是只有一个入口,但内部会对每个线程提供特有存储空间的Pattern

比如说有一个保管箱间,里面有许多用户的保管箱,当多个用户进入房间使用保管箱时,进到的是同一个房间,但一定是只能打开自己的保管箱,只能对自己的保管箱提取或放置物品。

ThreadLocal

public void set()

ThreadLocal类的set方法,可以将参数所指定的实例,存放到调用set方法的线程(现在的线程)所对应的存储空间。这里所存放的实例,可以使用get方法取得。注意set方法并没有用来传入表示线程的参数。在set方法里,会检查当前线程(也就是Thread.currentThread()的值),自动以这个值作为键值存放实例。

public Object get()

ThreadLocal类的get方法,可以取得调用get方法的线程所对应的实例(现在线程对应的实例)。之前set的实例,就是现在get的返回值。如果从来没有set过,就会返回null。与set方法一样,get方法也没有表示线程的参数。因为程序会在get里自己去检查现在的线程。也就是说自己本身就是键值。

程序示例

多个线程同时打印序号。每个线程的序号从1开始,各自按递增1的顺序打印序号。

public final class SequenceNumber {

 

  privatestatic final ThreadLocal<Integer> threadLocal = newThreadLocal<Integer>() {

      protectedInteger initialValue() {

         return1;

      };

  };

 

  publicstatic int getSequenceNumber() {

      intnumber = threadLocal.get();

 

      threadLocal.set(number+ 1);

 

      returnnumber;

  }

}

public class PrintThread extends Thread {

 

  publicPrintThread(String threadName) {

      super(threadName);

  }

 

  @Override

  publicvoid run() {

      while(true) {

         System.out.println(Thread.currentThread().getName()+ " : "

                +SequenceNumber.getSequenceNumber());

        

         try{

             Thread.sleep(500);

         }catch (InterruptedException e) {

             e.printStackTrace();

         }

      }

  }

}

public class Main {

 

  publicstatic void main(String[] args) {

      newPrintThread("AAA").start();

      newPrintThread("BBB").start();

      newPrintThread("CCC").start();

  }

 

}

从运行结果可以看出,各个线程各自按照自己的序号顺序打印。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值