用ThreadLocal实现Web Application的线程安全

ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名 为ThreadLocalVariable更容易理解一些。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供 独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。从线程的角度看,目标变量就像是线程的本地变量,这也是类 名中”Local“所要表达的意思。

public class SequenceNumber{

    private static ThreadLocal seqNum = new ThreadLocal(){

       public Integer initialValue(){

           return 0;

       }

    };



   public int getNextNum(){

       seqNum.set(seqNum.get()+1);

       return seqNum.get();

   }



   public static void main(String[] args){

       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 ; i < 3 ; i++){

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

                                         "] sn ["+sn.getNextNum() + "]");

          }

      }

  }

}
三个TestClient共享一个sn。运行以上代码,在控制台得到以下结果:
Thread[Thread-2] sn [1]

Thread[Thread-2] sn [2]

Thread[Thread-2] sn [3]

Thread[Thread-0] sn [1]

Thread[Thread-0] sn [2]

Thread[Thread-0] sn [3]

Thread[Thread-1] sn [1]

Thread[Thread-1] sn [2]

Thread[Thread-1] sn [3]

可以看到sn是线程安全的

你可能感兴趣的:(Java)