`
sungyang
  • 浏览: 21083 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

线程中多模块共享数据

阅读更多

之前项目中经常会碰到线程共享数据的场景,简单总结下:

1、通常情况会用java.lang.ThreadLocal来实现线程范围的共享变量,线程内共享,线程外独立;

2、ThreadLocal的作用和目的:用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据。

应用场景:订单处理、银行转账;

3、demo

package cn.cloudBy.concurrent;

import java.util.Random;

/**
 * @description:different modules(different classes or methods) share data in one thread
 * @author: sunyan
 * @time: 2016年1月7日 上午9:30:33
 */
public class ThreadLocalTest {

	public static void main(String[] args) {
		
		for (int i = 0; i < 2; i++) {
			
			new Thread(new Runnable() {

				public void run() {
					
					int data = new Random().nextInt();
					
					System.out.println(Thread.currentThread().getName()+ "put data:"+data);					
					MyThreadScopeData.getThreadInstance().setName("name" + data);
					
					MyThreadScopeData.getThreadInstance().setAge(data);
					
					new A().get();
					
					new B().get();
				}
			}).start();
		}
	}

	//moduleA
	static class A {
		
		public void get() {

			MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();
			System.out.println("A from " + Thread.currentThread().getName()
							+ " getMyData: " + myData.getName() + ","
							+ myData.getAge());
		}
	}

	//module B
	static class B {
		
		public void get() {

			MyThreadScopeData myData = MyThreadScopeData.getThreadInstance();
			System.out.println("B from " + Thread.currentThread().getName()
							+ " getMyData: " + myData.getName() + ","
							+ myData.getAge());
		}
	}
}

//data class
class MyThreadScopeData {
	
	private String name;
	
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	private MyThreadScopeData() {
	}

	private static ThreadLocal<MyThreadScopeData> map=new ThreadLocal<MyThreadScopeData>();

	public static MyThreadScopeData getThreadInstance() {

		MyThreadScopeData instance = map.get();

		if (instance == null) {

			instance = new MyThreadScopeData();

			map.set(instance);
		}
		return instance;
	}

}

 4、每个线程调用全局ThreadLocal对象的set方法,就相当于往其内部的map中增加一条记录,key分别是各自的线程,value是各自的set方法传进去的值。在线程结束时可以调用ThreadLocal.clear()方法,这样会更快释放内存,不调用也可以,因为线程结束后也可以自动释放相关的ThreadLocal变量(gc)。

分享到:
评论

相关推荐

    鱼刺多线程模块

    在"鱼刺多线程模块"中,开发者可以创建新的线程来执行特定任务,比如处理用户输入、计算复杂算法或是进行IO操作。线程间同步机制,如锁、信号量、条件变量等,可以防止数据竞争和死锁的发生,确保数据的一致性和程序...

    易语言多线程数据池模块

    在易语言中,多线程数据池模块是一个重要的组件,它允许开发者创建高效、并发的数据处理系统。这个模块主要用于管理和操作大量数据,尤其在高并发场景下,能够保证数据的稳定性和安全性。 多线程数据池的概念源自...

    易语言模块多线程支持模块.rar

    易语言的多线程模块可能提供了互斥量、信号量、事件对象等同步机制,确保线程安全地访问共享数据。 3. **线程通信**:线程间通信是为了让线程之间能够交换信息。易语言可能提供了消息队列、共享内存或者基于事件的...

    易语言多线程数据池模块源码(文本池+数据池-多线程版)

    在易语言中,这个多线程数据池模块源码可能是通过创建线程对象,然后在线程中实现数据的读取、写入和管理。数据池可能包含了一种或多种数据结构,如链表、数组等,用于存储和共享数据。源码中的设计可能包括锁机制,...

    VB 多线程模块案例

    总之,这个"VB 多线程模块案例"将为你提供一个深入理解VB中多线程编程的平台,包括线程的创建、同步、通信和管理,这些都是编写高效并发程序的关键技能。通过学习和实践这个案例,你可以提升自己在VB环境下进行多...

    易语言多线程模块

    在易语言中,多线程模块是一个关键的组成部分,它允许程序同时执行多个任务,提高程序的效率和响应性。本文将详细讲解易语言多线程模块的使用方法、核心概念以及如何通过源码实现线程的创建、运行、中止和销毁。 ...

    PC多线程支持模块 支持Windows和Linux

    在并发环境下,共享数据可能会引发竞态条件和死锁等问题。因此,PCMultiThreadSupport模块可能包括了锁机制和同步原语,以确保在多线程环境下的正确性和一致性。 总结来说,"PC多线程支持模块"是一个跨平台的工具,...

    完整版多线程模块.rar

    5. **线程安全**:在多线程环境中,对共享数据的访问可能引发竞态条件和其他同步问题。线程安全的编程实践包括使用锁、信号量、原子操作等来防止这些问题。 6. **死锁**:当两个或更多线程互相等待对方释放资源时,...

    Delphi多个DLL共享全局数据Demo

    在Delphi编程环境中,开发人员经常需要在多个动态链接库(DLL)之间共享数据,以实现模块化设计和代码重用。"Delphi多个DLL共享全局数据Demo"是一个实例,展示了如何在不同的DLL中有效地管理和交换信息。在这个场景中...

    完整版多线程模块.e.rar

    这个“完整版多线程模块.e.rar”压缩包很可能是提供了一套全面的学习资源,旨在帮助用户深入理解并掌握多线程技术。下面我们将详细探讨多线程的相关知识点。 **一、多线程的基本概念** 多线程是指在一个程序中存在...

    e语言-易语言多线程文件传输模块

    《易语言多线程文件传输模块详解》 易语言,作为一种中文编程语言,以其独特的语法设计和易学易用的特点,深受广大编程爱好者和初学者的欢迎。在信息技术高速发展的今天,文件传输已经成为日常工作中不可或缺的一...

    完整版多线程支持模块.rar

    在“完整版多线程支持模块.rar”这个压缩包中,很显然包含了一个全面的多线程支持模块,可能是用于某种编程语言的库或者框架,用于帮助开发者更好地管理和利用多线程特性。 一、多线程基础 1. 线程定义:线程是操作...

    Nachos的线程管理模块升级

    在这种问题中,五个哲学家线程共享五根筷子,需要遵循特定的规则避免死锁。通过使用信号量机制,可以确保哲学家们正确地拿起和放下筷子,从而实现线程间的同步和互斥。 总结,Nachos的线程管理模块升级涉及到了线程...

    使用线程添加数据

    总结来说,“使用线程添加数据”是多线程编程中的常见应用场景,涉及线程创建、同步、事务管理、线程池和通信等多个方面。正确理解和运用这些知识,能够有效地提升数据处理效率,改善应用程序的用户体验。

    易语言多线程操作模块源码

    在易语言中,多线程操作是提升程序性能和响应能力的重要手段,特别是在处理大量数据或者需要并发执行多个任务时。本文将深入探讨易语言中的多线程技术及其相关模块。 首先,我们要理解“互斥锁”(Mutex)。互斥锁...

    VB多线程模块(SuperThread调用范例)

    本资源"VB多线程模块(SuperThread调用范例)"提供了一个使用第三方库SuperThread的示例,帮助开发者理解和应用多线程。 1. **SuperThread库介绍** SuperThread是一款专门用于VB6的多线程组件,它简化了在VB环境中...

    C# 多线程抓取数据(酒店)

    3. **线程同步与互斥**:在多线程环境中,为防止多个线程同时访问共享资源导致数据不一致,需使用同步机制。C#提供了`Monitor`、`Mutex`、`Semaphore`、`lock`关键字等工具。本项目可能运用这些工具确保线程安全,...

    多线程的运用e语言多线程 e多线程

    在多线程环境中,数据共享可能会引发数据不一致问题,因此需要同步机制来保证数据的安全性。E语言中可能提供以下同步原语: 1. 锁(Lock):确保同一时间只有一个线程能访问特定的共享资源。 2. 条件变量(Condition...

    delphi多线程调用dll

    如果DLL中的函数不是线程安全的,或者它们修改了全局状态或共享数据,那么在多线程调用时就需要使用同步原语来保护这些操作。例如,我们可以在调用DLL函数前后加锁,确保同一时间只有一个线程在执行: ```delphi ...

    API实现多线程常用命令模块源码

    通过分析“API实现多线程常用命令模块源码”,我们可以学习到如何在易语言中创建、管理、同步线程,并了解实际项目中多线程编程的实践技巧。这份源码对于初学者来说是一个很好的学习资源,能帮助他们深入理解多线程...

Global site tag (gtag.js) - Google Analytics