网站有了域名然后怎么做,中小企业建网站注意,sem竞价推广托管,建设网站要什么手续ThreadLocal为解决多线程的并发问题提供了一种新的思路#xff0c;使用这个工具类可以优美的编写出多线程程序。 ThreadLocal他不是一个线程#xff0c;而是线程的一个本地化对象。当工作于多个线程的对象使用ThreadLocal维护变量时#xff0c;ThreadLocal为每个使用改变量的…ThreadLocal为解决多线程的并发问题提供了一种新的思路使用这个工具类可以优美的编写出多线程程序。 ThreadLocal他不是一个线程而是线程的一个本地化对象。当工作于多个线程的对象使用ThreadLocal维护变量时ThreadLocal为每个使用改变量的线程分配一个独立的变量副本所以每一个线程可以独立的改变自己的副本而不会影响其他线程的对应的副本。 ThreadLocal接口有四个方法 void set(Object value)设置当前的线程局部变量的值 public Obejct get()返回当前的线程所对应的线程局部变量的值 public void remove()将当前的线程的局部变量的值删除掉 protected Object initialValue()返回该线程局部变量的初始值默认实现直接返回一个null。 ThreadLocal如何做到为每一个线程维护一份独立的变量副本呢实现的思路是:在 ThreadLocal类中有个Map用于存储每一个线程的变量副本Map中元素的key为线程对象而value对应线程的变量副本。
下面直接上代码看实例public class SequenceNumber
{private static ThreadLocalInteger seqNum new ThreadLocalInteger(){public Integer initialValue(){return 0;}};public int getNextNum(){seqNum.set(seqNum.get()1);return seqNum.get();}public static void main (String[] args) throws java.lang.Exception{SequenceNumber sn new SequenceNumber();TestClient t1 new TestClient(sn);TestClient t2 new TestClient(sn);TestClient t3 new TestClient(sn);t1.start();t2.start();t3.start();}private static class TestClient extends Thread{private SequenceNumber sn;public TestClient(SequenceNumber sn){this.sn sn;}public void run (){for (int i 0;i3 ;i ) {System.out.println(thread[ Thread.currentThread().getName()]sn[ sn.getNextNum()]);}}}
}
运行后的输出如下从结果可以看出每个线程所产生的程序虽然共享同一个SequenceNumber 实例 但是他们呢并没有相互干扰的情况出现而是各自产生独立的序列号这是因为我我们通过h3ThreadLocal为每一个线程提供了独立的副本。/h3