`

线程本地存储

 
阅读更多

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

分享到:
评论

相关推荐

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

    【并发并行】_【C/C++]_【使用线程本地存储Thread Local Storage(TLS)调用复制文件接口的案例】 在多线程编程中,线程本地存储(Thread Local Storage,简称TLS)是一种用于存储线程私有数据的技术。每个线程都有...

    tls线程本地存储例子

    标题中的“tls线程本地存储”指的是在编程中,特别是在多线程环境下,使用Thread Local Storage(TLS)来实现线程私有的数据存储。TLS允许每个线程拥有自己的变量副本,确保了数据的安全性和隔离性,避免了在多线程...

    线程局部存储机制总结

    - `DWORD m_tlsIndex`:系统级线程本地存储的索引,用来标识每个线程的存储空间。 #### 四、线程局部存储的工作原理 在MFC中,每个线程通过`CThreadSlotData`类的实例管理自己的线程局部存储空间。`...

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

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

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

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

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

    标题 "sakeInject:Windows PE - CC++ 中的 TLS(线程本地存储)注入器" 指涉的是一个特定的软件开发工具或技术,它主要用于Windows可执行文件(PE,Portable Executable)中实现TLS(线程局部存储,Thread Local ...

    ios多线程编程

    配置线程属性时,可以设置线程的堆栈大小和线程本地存储等。 线程管理是确保多线程应用稳定运行的关键。它包括管理线程的生命周期、编写线程主体入口点以及中断线程等。特别要注意的是,编写线程主体入口点时,需要...

    多线程编程指南

    线程管理包括配置线程属性,如堆栈大小和线程本地存储,以及编写线程的主体入口点。线程入口点是指线程开始执行的函数或方法,开发者需要在此处理线程相关的初始化操作。中断线程则是一个比较复杂的话题,因为不同...

    多线程使用FMDB操作sqlite数据库

    1. **线程本地存储**:可以使用线程本地存储(Thread Local Storage, TLS)来为每个线程保存一个`FMDatabase`实例。这样,每个线程都有自己的数据库连接,避免了线程间的冲突。 2. **GCD(Grand Central Dispatch)...

    C#_细说多线程(上下)

    线程拥有自己的CPU寄存器、调用栈和线程本地存储(TLS)。这些组件共同构成了线程的状态信息。 - **关系**:一个进程可以包含多个应用程序域,每个应用程序域又可以拥有多个线程。虽然线程可以在不同的应用程序域间...

    MFC线程处理概述.doc

    CWinThread类是MFC中处理线程的核心,它利用线程本地存储(TLS,Thread Local Storage)来维护每个线程特有的上下文信息。用户可以直接实例化CWinThread对象,但通常推荐使用MFC提供的全局函数AfxBeginThread来创建...

    内存模型-多线程内存模型

    4. **线程本地存储**:C++09还引入了线程本地存储(Thread Local Storage, TLS),这是一种存储机制,可以在每个线程中独立维护变量的副本,减少了线程间通信的开销。 #### 五、案例分析 假设有一个简单的例子,其中...

    ios 多线程编程指南

    线程属性包括堆栈大小、线程本地存储等。正确配置这些属性可以帮助开发者管理线程资源,提高程序性能。 #### 2.4 编写线程的主体入口点 线程的入口点是线程开始执行代码的地方。通常在入口点代码中会创建自动释放池...

    电子书《java线程》

    10. **线程本地存储(ThreadLocal)**:为每个线程提供独立的变量副本,避免了线程间的共享数据冲突。 11. **并发集合**:如ConcurrentHashMap、CopyOnWriteArrayList等,这些集合类在并发环境下提供了高性能的读写...

    C#多线程编程实战源码

    12. **线程本地存储**:`ThreadLocal<T>`类允许每个线程拥有自己的变量副本,避免了线程同步的需要。 13. **死锁和竞态条件**:多线程编程中常见的问题,死锁是两个或多个线程互相等待对方释放资源,竞态条件是多个...

    caffe多线程运行速度案例分析.docx

    **线程本地存储(TLS)**是指一种为每个线程提供独立存储空间的技术。对于Caffe而言,`CaffeContext`作为TLS变量,只支持本线程内的存储和访问。当`Classifier`对象在主线程中构造时,它所依赖的`CaffeContext`也同样...

Global site tag (gtag.js) - Google Analytics