之前项目中经常会碰到线程共享数据的场景,简单总结下:
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)。
相关推荐
本文将介绍利用cluster模块创建的多线程如何共享数据的问题。 进程间数据共享 首先举个简单的例子,代码如下: var cluster = require('cluster'); var data = 0;//这里定义数据不会被所有进程共享,各个进程有...
只有可以被多线程访问的共享资源才需要考虑锁定,比如静态变量,再比如某些缓存中的值,而属于线程内部的变量不需要锁定。 2)多使用lock,少用Mutex 如果你一定要使用锁定,请尽量不要使用内核模块的锁定机制,...
易语言远程线程注入源码,远程线程注入,复制共享数据,输出,GetMsgProc,GetMsgHookOn,GetMsgHookOff,ThreadPro,WriteScreen,Int2Hex,api_UnhookWindowsHookEx,api_SetWindowsHookExA,api_LoadLibraryA,api_...
竞态条件(Race Conditions):多个线程访问共享资源时可能引发竞态条件,导致数据不一致性和程序错误。 死锁(Deadlocks):多线程编程容易出现死锁,即多个线程相互等待对方释放资源的情况,导致程序无法继续执行...
Queue模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构。 1.3注意模块的选择 避免使用thread模块 因为更高级别的threading模块更为先进,对线程的支持更为完善 而且使用thread模块里的属性有...
这样可以避免多个线程同时访问共享资源,从而避免数据不一致和其他潜在问题。 4. 基于Http协议:项目使用了Java的HttpURLConnection类来实现基于Http协议的文件下载。这使得项目具有较好的通用性,可以应用于各种...
枫影多线程模块.ec 核库函数.ec 模块.ec 模块_bmp转换为jpg.ec 模块_WinXP窗口v4.0版.ec 模块_与应用程序建立关联.ec 模块_与狡兔三窟建立关联.ec 模块_与黄金加密建立关联.ec 模块_仿WinXP窗口v1.0.ec 模块_仿WinXP...
Thread 是threading模块中最重要的类之一,可以使用它来创建线程。有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法;另一种是创建一个threading.Thread对象,在它的初始化函数(__init_
在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够保证数据的安全性和一致性,所以当多个线程需要进行数据交换的时候,队列就出现了,队列可以完美解决线程间的数据交换,保证线程间数据...
python 提供thread和theading两个线程模块,thread较底层,threading较方便,大多数情况下使用theading就足够了; thread_test.py start(), name, join() 进程是具有一定独立功能的程序关于某个数据集合上的一次...
多线程基础介绍.........................................................................................................................................15 定义多线程术语...................................
在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够保证数据的安全性和一致性,所以当多个线程需要进行数据交换的时候,队列就出现了,队列可以完美解决线程间的数据交换,保证线程间数据...
文章目录一、threading...(1)3、守护进程实例 (2)七、线程同步(Look)1、代码案例2、Look线程同步案例3、 with语法用于线程同步案例八、多线程与多进程的理解(代码实例)1、 共享数据(内存地址)2、进程和线程的执行速度
多线程技术保证了程序模块间的分离度,而且可通过合理划分功能模块而减少通信量,实现广泛的数据共享,从而使系统性能得到很大提高。但是,随着线程数目的增多,共享数据的管理将变得相当复杂。线程的增多导致对共享...
1 多线程基础介绍15 定义多线程术语15 符合多线程标准16 多线程的益处17 提高应用程序的响应 17 有效使用多处理器17 改进程序结构17 占用较少的系统资源17 结合线程和RPC(远程过程调用)18 多线程概念18 并发性和...
.NET framework提供了很多的类和数据类型来控制对共享资源的访问。 考虑一种我们经常遇到的情况:有一些全局变量和共享的类变量,我们需要从不同的线程来更新它们,可以通过使用System.Threading.Interlocked类...
超级列表框显示ACCESS表中数据.ec 超级列表框模糊查找.ec 超级列表框背景.ec 超级列表框补丁1.0.ec 超级列表框补助.ec 超级列表框选中项存为Excel文件.ec 超级列表框选择框状态被改变.ec 超级打印预览0716a.ec 超级...
' 改进"内存操作类"中"读取",参数三留空表示数据块全部数据,为-1表示全字节集数据 ' 改进"内存操作类"中"写入",参数三为-1表示全部数据并标记为字节集数据 ' 增加"正则表达式类",命令有:"创建","取匹配文本","取子...
线程中调用易包演示源码。 如果说易模块相当于C语言里面的lib文件,则易包就相当于dll文件,也就是说,易模块是在易程序之间建立静态共享,而易包是建立动态共享,避免以前易模块修改后需要重新编译所有使用了它的易程序...
更好的python中的多处理和多线程 关于多进程 multiprocess是一个叉multiprocessing ,并且被开发为的一部分pathos : multiprocessing是Python语言的软件包,它支持使用标准库的threading模块的API生成进程。 自...