ThreadLocal 与 static 变量

ThreadLocal是为解决多线程程序的并发问题而提出的,可以称之为线程局部变量。与一般的变量的区别在于,生命周期是在线程范围内的。
static变量是的生命周期与类的使用周期相同,即只要类存在,那么static变量也就存在。
那么一个 static 的 ThreadLocal会是什么样的呢?

看下面一个例子,

[java] view plain copy

  1. public class SequenceNumber {
  2. private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>(){
  3. public Integer initialValue(){
  4. return 0;
  5. }
  6. };
  7. public int getNextNum(){
  8. seqNum.set(seqNum.get() + 1);
  9. return seqNum.get();
  10. }
  11. public static void main(String[] args){
  12. SequenceNumber sn = new SequenceNumber();
  13. TestClient t1  = new TestClient(sn);
  14. TestClient t2  = new TestClient(sn);
  15. TestClient t3  = new TestClient(sn);
  16. t1.start();
  17. t2.start();
  18. t3.start();
  19. t1.print();
  20. t2.print();
  21. t3.print();
  22. }
  23. private static class TestClient extends Thread{
  24. private SequenceNumber sn ;
  25. public TestClient(SequenceNumber sn ){
  26. this.sn = sn;
  27. }
  28. public void run(){
  29. for(int i=0; i< 3; i++){
  30. System.out.println( Thread.currentThread().getName()  + " --> " + sn.getNextNum());
  31. }
  32. }
  33. public void print(){
  34. for(int i=0; i< 3; i++){
  35. System.out.println( Thread.currentThread().getName()  + " --> " + sn.getNextNum());
  36. }
  37. }
  38. }
  39. }

下面是结果

[java] view plain copy

  1. Thread-2 --> 1
  2. Thread-2 --> 2
  3. Thread-2 --> 3
  4. Thread-0 --> 1
  5. Thread-0 --> 2
  6. Thread-0 --> 3
  7. Thread-1 --> 1
  8. Thread-1 --> 2
  9. Thread-1 --> 3
  10. main --> 1
  11. main --> 2
  12. main --> 3
  13. main --> 4
  14. main --> 5
  15. main --> 6
  16. main --> 7
  17. main --> 8
  18. main --> 9

可以发现,static的ThreadLocal变量是一个与线程相关的静态变量,即一个线程内,static变量是被各个实例共同引用的,但是不同线程内,static变量是隔开的

时间: 2024-10-10 07:29:16

ThreadLocal 与 static 变量的相关文章

Java并发机制(4)--ThreadLocal线程本地变量(转)

转自:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3920407.html Java并发编程:深入剖析ThreadLocal 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的.各个线程中访问的是不同的对象. 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal

static 变量的作用:

概念:静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值.静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见. 1.先来介绍它的第一条也是最重要的一条:隐藏 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性. 2. static的第二个作用是保持变量内容的持久 存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化.共有两种变量存储在静态存储区:全局变量和static

转:C语言中的static变量和C++静态数据成员(static member)

转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量        a.静态局部变量在函数内定义,生存期为整个程序运行期间,但作用域与自动变量相同,只能在定义该变量的函数内使用.退出该函数后, 尽管该变量还继续存在,但不能使用它.        b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值.而对自动变量不赋初值,则其值是不定的.2).static全局变量        全局变量本身就是静

VC和gcc在保证函数static变量线程安全性上的区别

VC和gcc不同,不能保证静态变量的线程安全性.这就给我们的程序带来了很大的安全隐患和诸多不便.这一点应该引起我们的重视!尤其是在构造函数耗时比较长的时候,很可能给程序带来意想不到的结果.本文从测试代码开始,逐步分析原理,最后给出解决方案. 多线程状态下,VC不能保证在使用函数的静态变量的时候,它的构造函数已经被执行完毕,下面是一段测试代码: class TestStatic { public: TestStatic() { Sleep(1000*10); m_num = 999; } publ

const、static变量存放位置

我们将以下面的例子介绍const变量和static变量的存放位置: static int val_a = 1; // 初始化的静态变量 int val_b = 2;        // 全局变量 const int val_c = 3;  // const 全局变量 static int val_d;     // 未初始化的静态变量 int val_e;            // 未初始化的全局变量 int main() { static int val_f = 5;  // 初始化的局部静

java执行程序的内存分析系列专栏二之static变量和方法内存分析

昨天写了简单的聊了下java执行程序时简单的内存划分,今天我们接着往下聊,聊聊static变量和方法的内存分析. 1.static变量和方法的第一个特性内存分析 statiic变量和方法的第一个特性能通过类名.static变量和类名.static方法的形式调用,而普通只能对象的形式调用.但具体为什么是这样的,这得分析static变量和方法他们在内存中怎样分配的,因此在这里我首先建立一个学生类,里面有一个普通成员变量和一个静态成员变量以及一个普通方法和一个成员方法,然后建立了一个测试学生的类. 1

Android 4.1 APP中的static变量即使在APP退出后仍然不会被擦除

Android 4.1 APP中的static变量即使在APP退出后仍然会保留最后赋值状态. public class MainActivity extends Activity { private TextView tv; private static int i=10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVie

static变量一般是放在.cpp或.c文件中

static变量是有文件作用域的, 在a.c中定义的,就不能在b.c或者其它文件中用了. 至于static变量, 如果要把它的声明放进.h文件, 则它就不应该是一个static变量了, static变量一般是放在.cpp或.c文件中,且声明和定义在一起 static变量一般是放在.cpp或.c文件中,布布扣,bubuko.com

ecmall中static变量的使用-model模型代码设计

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 function &m($model_name, $params = array(), $is_new = false) {     <span style="backg

转载 IOS开发之---static变量

Objective-C 支持全局变量 主要有两种实现方式: (1)第一种和C/C++中的一样, 使用"extern"关键词: (2)另外一种就是使用单例实现. (比如我们经常会把一个变量放在AppDelegate里面作为全局变量来访问, 其中AppDelegate就是一个单例类)  在Objective-C中如何实现像C++中那样的静态成员变量呢? 你需要做的是在一个类A的implementation(.m或者.mm)文件中定义一个static变量,然后为A类定义静态成员函数(clas