`

jdk1.5——ThreadLocal实现线程范围的共享变量

 
阅读更多

 

优缺点和使用注意事项:

 

/*
 * ThreadLocal 用于每一个线程都有一个次线程对应的副本。“以空间换时间”  占用内存,提高效率,节约处理时间,同时保证事物一致性
 * ThreadLocal防止内存泄漏的做法-->弱引用:WeakReference   extends WeakReference<ThreadLocal>
 * 弱引用:引用对象如果不工作,JVM扫面到此现象后会回收引用数值,节省内存
 * 强引用:eg String name = "zhangsan"; 一般对象如果不extends WeakReference都是强引用对象,特点是引用不消失,即使引用不工作了
 * 	    引用值仍旧存在内存,不会被JVM回收掉
 * 
 * 写代码建议: 使用ThreadLocal后,可以手动调用其remove()方法。
 * 
 */

 

 

 

业务要求

多线程下,实现线程内,多业务下数据共享使用; 实现线程之间数据彼此隔离

 

应用案例: 银行多人汇款

 



 

 

应用代码模拟---> 获取线程数据conn

public class ConnectionManager {

	
	private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
	
	private ConnectionManager(){}
	
	public static Connection getInstance(){
		try {
			Connection conn = threadLocal.get();
			if(conn == null){
				conn = DriverManager.getConnection("");//获取数据库连接对象
				threadLocal.set(conn);
			}
			return conn;
		} catch (SQLException e) {
			e.printStackTrace();
		
		}
		return null;
	}
	
}

 

 

 

 

 

 

要点: 使用map将线程和线程内公共数据绑定起来

 

代码1  自定义实现

package thread;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * 1 实现线程范围内的数据共享
 * 2 实现线程之间的数据隔离
 * 3 使用map对象,将每个线程产生的数据放在map中,业务方法中 仅仅获取当前线程下的共享数据   达到2的目的
 * 
 * @author zm
 *
 *测试结果:
Thread-0 has put data 757103510
A from Thread-0 the data is: 757103510
B from Thread-0 the data is: 757103510
Thread-1 has put data -150123253
A from Thread-1 the data is: -150123253
B from Thread-1 the data is: -150123253
 */
public class ScopeShareDataInThread {

	// 
	public static int sharedata;
	public static Map map = new HashMap();
	
	public static void main(String[] args) {
		
		final Businness businness = new Businness();
		for(int i=0; i<2; i++) {
			new Thread(new Runnable(){
				@Override
				public void run() {
					sharedata = new Random().nextInt();
					System.out.println(Thread.currentThread().getName() + " has put data " + sharedata);
					map.put(Thread.currentThread(), sharedata);
					businness.business1(sharedata,map);
					businness.business2(sharedata,map);
				}
			}).start();
		}
		
	}

}

class Businness {
	// 业务1
	public void business1(int data,Map map){
		System.out.println("A from " + Thread.currentThread().getName() + " the data is: " + map.get(Thread.currentThread()));
	}
	// 业务2
	public void business2(int data,Map map){
		System.out.println("B from " + Thread.currentThread().getName() + " the data is: " + map.get(Thread.currentThread()));
	}
}

 

 

代码2 使用JDK提供的ThreadLocal类:

package thread;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * 使用jdk提供的类来实现 线程内数据共享 线程间数据隔离
 * 
 * threadLocal.set(sharedata) 会把数据放在当前线程中
 * threadLocal.get() 回从当前线程中得到存放的数据
 * 
 * 其实 threadLocal = map.put(Thread.currentThread(), youdata);
 * 
 * 测试结果:
Thread-1 has put data 193003072
A from Thread-1 the data is: 193003072
B from Thread-1 the data is: 193003072
Thread-0 has put data -2012177886
A from Thread-0 the data is: -2012177886
B from Thread-0 the data is: -2012177886
 * @author zm
 *
 */
public class MyThreadLocal {

	// 
	public static ThreadLocal threadLocal = new ThreadLocal();
	
	public static int sharedata;
	
	
	
	public static void main(String[] args) {
		
		final Businness1 businness = new Businness1();
		for(int i=0; i<2; i++) {
			new Thread(new Runnable(){
				@Override
				public void run() {
					sharedata = new Random().nextInt();
					System.out.println(Thread.currentThread().getName() + " has put data " + sharedata);
					threadLocal.set(sharedata);
					businness.business1(threadLocal);
					businness.business2(threadLocal);
				}
			}).start();
		}
		
	}

}

class Businness1 {
	// 业务1
	public void business1(ThreadLocal threadLocal){
		System.out.println("A from " + Thread.currentThread().getName() + " the data is: " + threadLocal.get());
	}
	// 业务2
	public void business2(ThreadLocal threadLocal){
		System.out.println("B from " + Thread.currentThread().getName() + " the data is: " + threadLocal.get());
	}
}

 

 

脑图:

 



 

 

 

 

  • 大小: 15.7 KB
  • 大小: 13.4 KB
分享到:
评论

相关推荐

    jdk1.5 windows版本 64位

    标题:“jdk1.5 windows版本 64位” 描述:“jdk1.5 windows版本 64位,Java开发依赖环境” 标签:“windows” 在这个主题中,我们聚焦的是Oracle JDK 1.5(也被称为Java Development Kit,简称JDK)在Windows...

    jdk1.5x64位 windows版.zip

    此外,JDK1.5还引入了变量args参数,使得在main方法中接收命令行参数变得更加简洁。之前需要创建一个数组来接收参数,现在可以直接用varargs语法来实现。 在编程实践中,JDK1.5添加了for-each循环(也称为增强for...

    linux系统jdk1.5下载

    Linux系统中的JDK1.5是Java开发工具包的一个早期版本,主要针对Java语言的编译、运行和调试提供支持。这个版本在今天已经相对较为罕见,因为Java已经有了多个后续版本,包括JDK7、JDK8、JDK9直至最新的JDK17等。然而...

    Java-jdk1.5安装包

    JDK1.5,也称为Java 5.0,是一个重要的版本,它引入了许多新的特性和改进,对Java语言的发展产生了深远影响。 一、泛型(Generics) 在Java 5.0中,最重要的特性之一就是泛型的引入。泛型允许开发者在定义类、接口...

    jdk1.5.exe jdk1.5

    jdk1.5.exe jdk1.5 jdk1.5下载

    JDK1.5,JDK1.5

    泛型是JDK1.5最重要的特性之一,它允许在类、接口和方法声明中使用类型参数,以实现数据类型的参数化。泛型提高了代码的类型安全性和可读性,减少了类型转换的需要,并允许编译器检查类型错误。 2. **自动装箱与...

    包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)

    这个压缩包包含了三个不同版本的JDK:JDK 1.5、JDK 1.6和JDK 1.8,其中1.5和1.6是早期版本,而1.8是最流行且广泛使用的版本之一。 **JDK 1.5(也称为Java 5.0)** JDK 1.5在2004年发布,引入了许多重要的新特性,如...

    jdk1.5免安装版

    绝版jdk1.5,非常不错的资源。用起来很好。是 Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,...

    简单易用通用(xls,xlsx)导入导出操作 jdk1.5+

    前几天上传过这个资源,因为是在jdk1.6上开发的, 测试了一下在jdk1.5上不能用, 今天重新用jdk1.5编译了一下, 这个是可以支持jdk1.5+的 将 pu-xlscommon-1.0.0.jar 添加到工程的 /lib 目录下 用法在附件中 XlsTest....

    JDK1.5的泛型实现.pdf

    JDK1.5的泛型实现.pdf

    window JDK1.5 32位 绿色免安装版,可以安装多个JDK使用

    标题中的"window JDK1.5 32位 绿色免安装版"指的是适用于Windows操作系统的32位版本的JDK 1.5,它是一个便携式版本,无需正式安装即可使用。这种绿色免安装版通常是为了方便开发者在不同机器间快速切换工作环境,或...

    jdk 1.5 linux (共三个文件)之一

    测试可用的linux版jdk1.5,jdk-1_5_0_19-linux-i586-rpm.bin

    JDK1.5的泛型实现.zip

    **JDK 1.5 泛型实现** Java Development Kit (JDK) 1.5 是一个里程碑式的版本,因为它引入了泛型,这是一项重要的编程特性,极大地提高了代码的类型安全性和可读性。泛型允许在编译时进行类型检查,避免了运行时...

    IBM_jdk1.5_Guide.zip_IBM jdk 1.5_aix_ibm java1.5_ibm jdk1.5 wind

    在"IBM_jdk1.5_Guide.pdf"这个文档中,很可能是IBM JDK 1.5的官方指南或开发者手册,它将详细阐述如何安装、配置和使用IBM JDK 1.5,以及如何在AIX环境下进行Java开发。而"www.pudn.com.txt"可能是下载资源的来源...

    javajdk1.5安装与配置环境变量(最新).txt

    ### JDK 1.5 安装与配置环境变量详解 #### 一、JDK 1.5 概述 JDK(Java Development Kit)是Java语言的开发工具包,包含了编译器、解释器等核心组件,是进行Java程序开发的基础。JDK 1.5(也称为Java SE 5.0)是...

    JDK1.5最终版全平台下载

    JDK1.5 全平台安装包下载 百度网盘资源 jdk-1_5_0_22-linux-amd64-rpm.bin jdk-1_5_0_22-linux-amd64.bin jdk-1_5_0_22-linux-i586-rpm.bin jdk-1_5_0_22-linux-i586.bin jdk-1_5_0_22-solaris-amd64...

    详细介绍JDK1.5的各种新特性

    **JDK1.5**,又称为Java Development Kit的第5个主要版本,标志着Java语言的一个重大里程碑。这个版本引入了一系列创新性特性和改进,极大地提升了开发效率和代码的可读性,为Java编程带来了全新的体验。以下是JDK...

    jdk1.5 windows 64位官方正式版,绝对有效

    变量注解(annotations)是JDK1.5引入的新特性,它允许在代码中添加元数据,这些元数据可以用于编译器检查、代码生成、运行时处理等。例如,@Override注解确保方法是重写父类的方法,@Deprecated则标记不再推荐使用...

    IBMJDK1.5linux.zip

    在压缩包"IBMJDK1.5linux.zip"中,主要包含的是IBM JDK 1.5的安装文件和相关文档。安装完成后,开发者可以通过设置环境变量(如JAVA_HOME、PATH)来使用这个JDK。通常,这个JDK会包含Java编译器(javac)、Java解释...

    jdk 1.5 线程的使用,简单例子

    通过接口java.util.concurrent.Callable 的使用 实现线程的启用,程序为一个main的例子,可以直接运行(jdk1.5 以上版本)

Global site tag (gtag.js) - Google Analytics