`

线程本地存储

 
阅读更多

       先简要对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竟然没有出现问题。两个线程运行正常,互不影响。

分享到:
评论

相关推荐

    论文研究-用托管代码实现线程本地存储的三种方法 .pdf

    用托管代码实现线程本地存储的三种方法,王曼韬,,多线程环境下实现线程本地存储是多线程应用中的一种基本技术,本文详细论述了用托管代码实现线程本地存储的三种方法,并对这些方

    [并发并行]_[C/C++]_[使用线程本地存储Thread Local Storage(TLS)调用复制文件接口的案例]

    http://blog.csdn.net/infoworld/article/details/49715355 项目代码,mingw编译.

    tls线程本地存储例子

    http://blog.csdn.net/infoworld/article/details/49715355 mingw编译

    ELF -- 线程本地存储

    ELF Handling For Thread Local Storage

    Swift中类型安全的线程本地存储-Swift开发

    Threadly是一个Swift µframework,它允许类型安全的线程本地存储。 什么是线程本地存储? 线程本地存储(TLS)使您可以定义一个变量,每个变量Threadly是一个Swift µframework,可进行类型安全的线程本地存储。 ...

    thread_local-rs:Rust的按对象线程本地存储

    不同,这允许按对象进行线程本地存储thread_local! 宏,仅允许静态本地线程存储。 用法 将此添加到您的Cargo.toml : [ dependencies ] thread_local = " 1.1 " 最低Rust版本 该板条箱的最低支持Rust版本(MSRV)为...

    sakeInject:Windows PE - CC++ 中的 TLS(线程本地存储)注入器

    日本清酒C/C++ 中的 TLS(线程本地存储)注入器

    java线程学习笔记

    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 线程...

    2020最新Java面试题及答案(带完整目录).pdf

    当线程本地存储、缓 冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。 Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可 用的 CPU 上。当原生...

    .Net 多线程编程

    本资源是英文版,详细介绍了.net中的多线程编程技术,包括线程同步,线程池,线程本地存储等关键性的主题

    swift-ThreadlySwift中类型安全的本地线程存储

    Threadly:Swift中类型安全的本地线程存储

    weak-lock-free:具有弱键和分离线程本地存储的并发映射的实现

    隐式并发删除(包含收集的键的条目由外部线程删除)。 显式并发删除(与地图的参考队列的显式交互)。 作为此WeakConcurrentMap的包装,该程序包还包含DetachedThreadLocal ,它描述了弱并发映射,其中当前线程...

    关于Linux线程的线程栈以及TLS

    本文描述LinuxNPTL的线程栈简要实现以及线程本地存储的原理,实验环境中Linux内核版本为2.6.32,glibc版本是2.12.1,Linux发行版为ubuntu,硬件平台为x86的32位系统。b.对于LinuxNPTL线程,有很多话题。本文挑选了...

    Java核心面试题汇总(最新版)

    当线程本地存储、缓 冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。 Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可 用的 CPU 上。当原生...

    iOS多线程编程指南

    2.3.2 配置线程本地存储....................................................................................... 20 第三章 RUN LOOPS .......................................................................

    Data2.0.rar_dbhelper_参数化_参数配置 C

    强大的数据库访问类dbhelper 2.0 ...5、使用了线程本地存储,使之能支持在业务逻辑层显式控制事务。 6、注释较为详细,配置十分简单,方法较为简洁(加上注释总共200多行代码)。 7、开源,容易修改。

    gls:快速goroutine本地存储

    gls 快速goroutine本地存储警告关于为什么在Go中实现和使用线程本地存储(实际上是goroutine本地存储)是一个坏主意,有大量的文档和讨论。 例如,请参阅和的 ,这是鼓励您解决需要goroutine本地存储的问题的方式。 ...

    gls:Goroutine本地存储

    Goroutine本地存储 该库是golang中线程本地存储模式的实现。 作为一种语言,Go掩藏了与goroutine相关的复杂性,从内部通信(通过通道)到阻止/解除阻止。 与Java不同,golang对goroutine的控制很少。 在这种情况下,...

Global site tag (gtag.js) - Google Analytics