`
男人50
  • 浏览: 228199 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

跨线程时共享数据

 
阅读更多
在Hystrix中,如果想在跨线程时共享数据,必须通过HystrixRequestVariableDefault申明变量
HystrixRequestVariableDefault name = new HystrixRequestVariableDefault();
name.set("占小狼");

其实在用法上,和ThreadLocal是一样的,只是需要对现有代码的大量改造。
看下这个方案的实现原理,先从set开始。
public void set(T value) {
  HystrixRequestContext.getContextForCurrentThread().state.put(this, new LazyInitializer<T>(this, value));
}

Hystrix内部通过HystrixRequestContext实现数据的跨线程传递,getContextForCurrentThread得到的是当前线程的HystrixRequestContext对象,每个HystrixRequestContext对象都有一个对应ConcurrentHashMap变量state,负责保存通过HystrixRequestVariableDefault初始化的数据。
通过set方法,该对象和数据会被保存在一个当前线程所属的map中。为了实现数据的跨线程传递,只需要在初始化task的时候,把主线程的HystrixRequestContext变量保存起来,在task执行的时候,重新赋值到子线程的上下文中,这样在子线程中就可以顺利拿到这些数据。
Hystrix中通过HystrixContextCallable包装原始Callable,并使用parentThreadState保存了当前线程的HystrixRequestContext变量。







任务执行时,先保存子线程现有的HystrixRequestContext变量,再赋值主线程的HystrixRequestContext变量,任务执行完成后,重新还原子线程。
如果不想使用Hystrix这种方式实现,也可以使用Hystrix提供的插件方式重新包装task,通过实现HystrixConcurrencyStrategy类,重写wrapCallable方法,和Hystrix的实现原理类似。
比如提供一个继承ThreadLocal的XXXThreadLocal类,那么业务方在使用时,就可以这样使用。
ThreadLocal name = new XXXThreadLocal();
name.set("占小狼");

这种方式看起来对已有逻辑只有一点小小的改动,对于新接入的也不那么陌生。

作者:占小狼
链接:https://www.jianshu.com/p/c60fe209a799
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
分享到:
评论

相关推荐

    .NET4利用MemoryMappedFile实现跨进程多个可执行程序之间的通信

    共享内存通信可以解决跨线程、跨进程、跨EXE之间通信的问题 对于需要传输图片等引用类数据,可以通过序列化和反序列化配合共享内存实现跨进程(跨EXE)通信 共享内存可以从磁盘文件中映射,也可以直接映射到内存中。...

    Delphi多线程编程之三 同步读写全局数据

    互斥非常类似于临界区,除了两个关键的区别:首先,互斥可用于跨进程的线程同步。其次,互斥能被赋予一个字符串名字,并且通过引用此名字创建现有互斥对象的附加句柄。 提示临界区与事件对象(比如互斥对象)的最大的...

    C#线程锁介绍源码

    Interlocked 类提供了同步对多个线程共享的变量的访问的方法。如果该变量位于共享内存中,则不同进程的线程就可以使用该机制。互锁操作是原子的,即整个操作是不能由相 同变量上的另一个互锁操作所中断的单元。这在...

    易语言-多进程数据共享例程 [Mutex] [Semaphore]

    由于其它原因,不想用 窗口消息/文件映射/socket 等进行跨进程通信,所以写了本例子,用的信号量及互斥体进行操作。 信号量可传递4/8/12字节数据。里面演示了4字节处理。8/12字节需要cha询句柄信息处理就不处理了,...

    垃圾回收器是什么1

    例如,在C++中我们使用vector做同样的事情,当数据在作用域不再使用时被自动调用的一种钩子函数:但是多数情况下更加复杂,特别是对象被多个线程跨线程共享,仅仅

    射箭—从Rc / Arc指针类型抽象的库。-Rust开发

    这使您可以创建指针类型可参数化的数据结构,从而在不需要跨线程共享数据时可以避免Arc的开销。 在支持更高种类的多态性的语言中,无需任何库即可轻松实现,但锈尚不支持。 为了模仿更高种类的多态性,射箭采用了...

    php-shared-memory:跨多个 PHP 应用程序共享变量

    由于此类每次请求或设置属性时都会存储和恢复其数据,因此应用程序之间的数据始终是最新的。 并且因为 PHP 有一个很好的内置咨询锁功能,可以有任意数量的应用程序,没有对同步文件的并发访问。 用例 长时间运行的...

    多线程编程指南PDF

    设置线程特定数据..............................................................................................................................31 3 获取线程特定数据........................................

    C#API中的模型和它们的接口设计

    2.在共享对象时(特别是在跨线程共享时),考虑使用不可变模型。3.考虑支持MVVM风格UI的单层和多层撤消。4.在实现属性变更通知时避免不必要的内存分配。5.不要覆盖模型的Equals和GetHashCode方法。在传统的MVC、MVP...

    C# API中模型与它们的接口设计详解

    在共享对象时(特别是在跨线程共享时),考虑使用不可变模型。 考虑支持MVVM风格UI的单层和多层撤消。 在实现属性变更通知时避免不必要的内存分配。 不要覆盖模型的Equals和GetHashCode方法。 在传统的MVC、MVP、...

    04735--数据库系统原理.doc

    A、视图 B、表 C、数据 D、数据库 2、数据库的简称( B ) A、DA B、DB C、BD D、DD 3、( D )是指长期储存在计算机内的、有组织的、可共享的数据集合,以及数据之间的逻辑关系 的集合。 A、视图 B、数据 C、表 D、...

    04735--数据库系统原理(1).doc

    A、视图 B、表 C、数据 D、数据库 2、数据库的简称( B ) A、DA B、DB C、BD D、DD 3、( D )是指长期储存在计算机内的、有组织的、可共享的数据集合,以及数据之间的逻辑关系 的集合。 A、视图 B、数据 C、表 D、...

    一个进程池的服务器程序

    当父进程发现请求数 &gt;= 子进程数时,父进程创建新的子进程,并把子进程数加1(当然子进程数有个预先上限);当父进程发现子进程数大于请求数加1时,父进程杀死多余的子进程。 总的来说,思想是让子进程accept并处理...

    Java Thread应该注意的问题

    本文介绍了Java的线程编程中处理同步对象的恒定性、放置共享数据、同步的粒度、线程之间的通知、跨类的同步对象时应该注意的问题。

    Android IPC机制利用Messenger实现跨进程通信

    写作原因:跨进程通信的实现和理解是Android进阶中重要的一环。下面博主分享IPC一些相关知识、操作及自己在学习IPC过程中的...由于进程之间不能像线程一样共享内存,所以数据通信不能像线程一般进行。在Android中可以

    多线程编程指南(系统描述了线程标准 线程同步 多线程编程原则 等)

    删除线程特定数据键................................................................................................................. 30 3 设置线程特定数据..................................................

    Java核心面试题汇总(最新版)

    我们都知道 Java 源文件,通过编译器,能够生产相应的.Class 文件,也就是字节码文件, 而字节码文件又通过 Java 虚拟机中的解释器,编译成特定机器上的机器码 。 也就是如下: ...当线程结束时, 13/

    jdk-10.0.1_linux-x64bit rpm格式CSDN下载

    应用程序数据共享,通过跨进程共享通用类的元数据,减少空间占用及启动时长。 线程本地握手,不执行全局 VM 安全点也能对线程执行回调,同时实现单线程停止回调。 JDK 提供了一组默认证书,开源 Java SE 的 CA程序...

Global site tag (gtag.js) - Google Analytics