`
nbkangta
  • 浏览: 424903 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

用ThreadLocal实现Web Application的线程安全

阅读更多

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

public class SequenceNumber{

    private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>(){

       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 ThreadLocal多线程专属的变量源码

    java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多...

    线程ThreadLocal机制实现例子

    本例以序列号生成的程序为例,展示ThreadLocal的使用

    TestNG多线程安全吗?ThreadLocal:有我还能不安全?

    目录一、背景介绍二、TestNG多线程详解2.1 TestNG多线程实现2.2 TestNG多线程效果演示三、ThreadLocal3.1 ThreadLocal概念3.2 具体实现 一、背景介绍  在使用Selenium+TestNG做WebUI自动化过程中,为了能够加快Web...

    java多线程安全性基础介绍.pptx

    java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...

    ThreadLocal:如何优雅的解决SimpleDateFormat多线程安全问题

    目录SimpleDateFormat诡异bug复现SimpleDateFormat诡异bug字符串日期转Date日期(parse)Date日期转String类型(format)SimpleDateFormat出现bug...ThreadLocal注意事项使用ThreadLocal解决SimpleDateFormat线程安全问题总结...

    线程安全你还在用synchronized?

    你还在用synchronized?线程安全相关知识深入剖析

    Android ThreadLocal实现原理

    主要介绍ThreadLocal的原理,实例分析以及注意事项

    ThreadLocal

    ThreadLocal入门教程。 讲解了线程安全和ThreadLocal的使用的基本知识。

    jKill#basic-notes#ThreadLocal实现原理1

    通过ThreadLocal对象定位到线程:Thread.currentThread()通过ThreadLocal对象拿到所在的ThreadLocalMap: T

    ThreadLocal跨线程问题

    通常复杂的处理流程中,我们会使用一些异步处理的手段,那么这种场景下ThreadLocal即可能出现获取失败的问题。 public class ThreadLocalTest { public static void main(String[] args) { ThreadLocal ...

    ThreadLocal:可移植和实现可配置的c ++ 11,例如线程本地

    线程本地 可移植,实现可配置,并且与c++11 thread_local兼容。 使用宏THREADL_LOCA(T)的相同代码支持由宏USE_STD_THREAD_LOCAL控制的不同实现。 宏THREAD_LOCAL(...)的默认实现是c ++ 11 thread_local关键字(如果...

    Hibernate用ThreadLocal模式(线程局部变量模式)管理Session

    今天小编就为大家分享一篇关于Hibernate用ThreadLocal模式(线程局部变量模式)管理Session,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    使用ThreadLocal解决代码分层问题

    javaee开发常见的模式有MVC模式,在C层中常常会再次分层,如:servlet(web层)、service(业务逻辑层)、dao(数据访问层),其中service和dao最容易混在一起,如转...所以,使用ThreadLocal可以解决这样的分层问题。

    Java中的线程同步与ThreadLocal无锁化线程封闭实现

    主要介绍了Java中的线程同步与ThreadLocal无锁化线程封闭实现,Synchronized关键字与ThreadLocal变量的使用是Java中线程控制的基础,需要的朋友可以参考下

    2、导致JVM内存泄露的ThreadLocal详解

    导致JVM内存泄露的ThreadLocal详解 为什么要有ThreadLocal ThreadLocal的使用 实现解析 引发的内存泄漏分析 错误使用ThreadLocal导致 线程不安全分析

    ThreadLocal详解及说明

    关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. ...

    Java ThreadLocal 线程安全问题解决方案

    主要介绍了Java ThreadLocal 线程安全问题解决方案的相关资料,需要的朋友可以参考下

    ThreadLocal.pdf

    ThreadLocal

    使用Java ThreadLocal.docx

    虽然所有的线程都能访问到这个ThreadLocal实例,但是每个线程却只能访问到自己通过调用ThreadLocal的set()方法设置的值。即使是两个不同的线程在同一个ThreadLocal对象上设置了不同的值,他们仍然无法访问到对方的值...

Global site tag (gtag.js) - Google Analytics