之前项目中经常会碰到线程共享数据的场景,简单总结下:
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操作。线程间同步机制,如锁、信号量、条件变量等,可以防止数据竞争和死锁的发生,确保数据的一致性和程序...
在易语言中,多线程数据池模块是一个重要的组件,它允许开发者创建高效、并发的数据处理系统。这个模块主要用于管理和操作大量数据,尤其在高并发场景下,能够保证数据的稳定性和安全性。 多线程数据池的概念源自...
易语言的多线程模块可能提供了互斥量、信号量、事件对象等同步机制,确保线程安全地访问共享数据。 3. **线程通信**:线程间通信是为了让线程之间能够交换信息。易语言可能提供了消息队列、共享内存或者基于事件的...
在易语言中,这个多线程数据池模块源码可能是通过创建线程对象,然后在线程中实现数据的读取、写入和管理。数据池可能包含了一种或多种数据结构,如链表、数组等,用于存储和共享数据。源码中的设计可能包括锁机制,...
总之,这个"VB 多线程模块案例"将为你提供一个深入理解VB中多线程编程的平台,包括线程的创建、同步、通信和管理,这些都是编写高效并发程序的关键技能。通过学习和实践这个案例,你可以提升自己在VB环境下进行多...
在易语言中,多线程模块是一个关键的组成部分,它允许程序同时执行多个任务,提高程序的效率和响应性。本文将详细讲解易语言多线程模块的使用方法、核心概念以及如何通过源码实现线程的创建、运行、中止和销毁。 ...
在并发环境下,共享数据可能会引发竞态条件和死锁等问题。因此,PCMultiThreadSupport模块可能包括了锁机制和同步原语,以确保在多线程环境下的正确性和一致性。 总结来说,"PC多线程支持模块"是一个跨平台的工具,...
5. **线程安全**:在多线程环境中,对共享数据的访问可能引发竞态条件和其他同步问题。线程安全的编程实践包括使用锁、信号量、原子操作等来防止这些问题。 6. **死锁**:当两个或更多线程互相等待对方释放资源时,...
在Delphi编程环境中,开发人员经常需要在多个动态链接库(DLL)之间共享数据,以实现模块化设计和代码重用。"Delphi多个DLL共享全局数据Demo"是一个实例,展示了如何在不同的DLL中有效地管理和交换信息。在这个场景中...
这个“完整版多线程模块.e.rar”压缩包很可能是提供了一套全面的学习资源,旨在帮助用户深入理解并掌握多线程技术。下面我们将详细探讨多线程的相关知识点。 **一、多线程的基本概念** 多线程是指在一个程序中存在...
《易语言多线程文件传输模块详解》 易语言,作为一种中文编程语言,以其独特的语法设计和易学易用的特点,深受广大编程爱好者和初学者的欢迎。在信息技术高速发展的今天,文件传输已经成为日常工作中不可或缺的一...
在“完整版多线程支持模块.rar”这个压缩包中,很显然包含了一个全面的多线程支持模块,可能是用于某种编程语言的库或者框架,用于帮助开发者更好地管理和利用多线程特性。 一、多线程基础 1. 线程定义:线程是操作...
在这种问题中,五个哲学家线程共享五根筷子,需要遵循特定的规则避免死锁。通过使用信号量机制,可以确保哲学家们正确地拿起和放下筷子,从而实现线程间的同步和互斥。 总结,Nachos的线程管理模块升级涉及到了线程...
总结来说,“使用线程添加数据”是多线程编程中的常见应用场景,涉及线程创建、同步、事务管理、线程池和通信等多个方面。正确理解和运用这些知识,能够有效地提升数据处理效率,改善应用程序的用户体验。
在易语言中,多线程操作是提升程序性能和响应能力的重要手段,特别是在处理大量数据或者需要并发执行多个任务时。本文将深入探讨易语言中的多线程技术及其相关模块。 首先,我们要理解“互斥锁”(Mutex)。互斥锁...
本资源"VB多线程模块(SuperThread调用范例)"提供了一个使用第三方库SuperThread的示例,帮助开发者理解和应用多线程。 1. **SuperThread库介绍** SuperThread是一款专门用于VB6的多线程组件,它简化了在VB环境中...
3. **线程同步与互斥**:在多线程环境中,为防止多个线程同时访问共享资源导致数据不一致,需使用同步机制。C#提供了`Monitor`、`Mutex`、`Semaphore`、`lock`关键字等工具。本项目可能运用这些工具确保线程安全,...
在多线程环境中,数据共享可能会引发数据不一致问题,因此需要同步机制来保证数据的安全性。E语言中可能提供以下同步原语: 1. 锁(Lock):确保同一时间只有一个线程能访问特定的共享资源。 2. 条件变量(Condition...
如果DLL中的函数不是线程安全的,或者它们修改了全局状态或共享数据,那么在多线程调用时就需要使用同步原语来保护这些操作。例如,我们可以在调用DLL函数前后加锁,确保同一时间只有一个线程在执行: ```delphi ...
通过分析“API实现多线程常用命令模块源码”,我们可以学习到如何在易语言中创建、管理、同步线程,并了解实际项目中多线程编程的实践技巧。这份源码对于初学者来说是一个很好的学习资源,能帮助他们深入理解多线程...