先简要对ThreadLocal进行一下说明,大家都知道synchronized,他是为了解决线程互斥访问临界资源的。而ThreadLocal是为了隔离临界资源(可能这里不应该叫临界资源了,应该叫被共享的资源),创建副本解决synchronized要解决的那个问题的。
看个例子先:
package com.wjy.threadlocal; public class Student { private int age=0; public int getAge(){ return this.age; } public void setAge(int age){ this.age=age; } }
package com.wjy.threadlocal; import java.util.Random; public class ThreadLocalDemo implements Runnable{ private final static ThreadLocal studentLocal=new ThreadLocal(); public static void main(String args[]){ ThreadLocalDemo td=new ThreadLocalDemo(); Thread t1=new Thread(td, "thread1"); Thread t2=new Thread(td, "thread2"); t1.start(); t2.start(); } @Override public void run() { // TODO Auto-generated method stub accessStudent(); } protected Student getStudent(){ Student student=(Student)studentLocal.get(); if(student==null){ student=new Student(); studentLocal.set(student); } return student; } public void accessStudent(){ String currentThreadName=Thread.currentThread().getName(); System.out.println("Current thread: "+currentThreadName); Random random=new Random(); int age=random.nextInt(100); Student student=getStudent(); student.setAge(age); System.out.println("thread "+currentThreadName+" set age to: "+age); System.out.println("thread "+currentThreadName+" first read age is: "+student.getAge()); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("thread "+currentThreadName+" second read age is: "+student.getAge()); } }
惊奇地发现,在同时被两个线程共享age的情况下,age竟然没有出现问题。两个线程运行正常,互不影响。
相关推荐
用托管代码实现线程本地存储的三种方法,王曼韬,,多线程环境下实现线程本地存储是多线程应用中的一种基本技术,本文详细论述了用托管代码实现线程本地存储的三种方法,并对这些方
http://blog.csdn.net/infoworld/article/details/49715355 项目代码,mingw编译.
http://blog.csdn.net/infoworld/article/details/49715355 mingw编译
ELF Handling For Thread Local Storage
Threadly是一个Swift µframework,它允许类型安全的线程本地存储。 什么是线程本地存储? 线程本地存储(TLS)使您可以定义一个变量,每个变量Threadly是一个Swift µframework,可进行类型安全的线程本地存储。 ...
不同,这允许按对象进行线程本地存储thread_local! 宏,仅允许静态本地线程存储。 用法 将此添加到您的Cargo.toml : [ dependencies ] thread_local = " 1.1 " 最低Rust版本 该板条箱的最低支持Rust版本(MSRV)为...
日本清酒C/C++ 中的 TLS(线程本地存储)注入器
2.3 线程本地存储(Java.lang.ThreadLocal) 15 2.4 线程阻塞 17 2.4.1 调用sleep(millisecond)使任务进入休眠状态 17 2.4.2 等待输出与输入 17 2.4.3 对象锁不可用 17 2.4.4 通过wait()使线程挂起。 17 2.5 线程...
当线程本地存储、缓 冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。 Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可 用的 CPU 上。当原生...
本资源是英文版,详细介绍了.net中的多线程编程技术,包括线程同步,线程池,线程本地存储等关键性的主题
Threadly:Swift中类型安全的本地线程存储
隐式并发删除(包含收集的键的条目由外部线程删除)。 显式并发删除(与地图的参考队列的显式交互)。 作为此WeakConcurrentMap的包装,该程序包还包含DetachedThreadLocal ,它描述了弱并发映射,其中当前线程...
本文描述LinuxNPTL的线程栈简要实现以及线程本地存储的原理,实验环境中Linux内核版本为2.6.32,glibc版本是2.12.1,Linux发行版为ubuntu,硬件平台为x86的32位系统。b.对于LinuxNPTL线程,有很多话题。本文挑选了...
当线程本地存储、缓 冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。 Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可 用的 CPU 上。当原生...
2.3.2 配置线程本地存储....................................................................................... 20 第三章 RUN LOOPS .......................................................................
强大的数据库访问类dbhelper 2.0 ...5、使用了线程本地存储,使之能支持在业务逻辑层显式控制事务。 6、注释较为详细,配置十分简单,方法较为简洁(加上注释总共200多行代码)。 7、开源,容易修改。
gls 快速goroutine本地存储警告关于为什么在Go中实现和使用线程本地存储(实际上是goroutine本地存储)是一个坏主意,有大量的文档和讨论。 例如,请参阅和的 ,这是鼓励您解决需要goroutine本地存储的问题的方式。 ...
Goroutine本地存储 该库是golang中线程本地存储模式的实现。 作为一种语言,Go掩藏了与goroutine相关的复杂性,从内部通信(通过通道)到阻止/解除阻止。 与Java不同,golang对goroutine的控制很少。 在这种情况下,...