在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
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
分享到:
相关推荐
共享内存通信可以解决跨线程、跨进程、跨EXE之间通信的问题 对于需要传输图片等引用类数据,可以通过序列化和反序列化配合共享内存实现跨进程(跨EXE)通信 共享内存可以从磁盘文件中映射,也可以直接映射到内存中。...
互斥非常类似于临界区,除了两个关键的区别:首先,互斥可用于跨进程的线程同步。其次,互斥能被赋予一个字符串名字,并且通过引用此名字创建现有互斥对象的附加句柄。 提示临界区与事件对象(比如互斥对象)的最大的...
Interlocked 类提供了同步对多个线程共享的变量的访问的方法。如果该变量位于共享内存中,则不同进程的线程就可以使用该机制。互锁操作是原子的,即整个操作是不能由相 同变量上的另一个互锁操作所中断的单元。这在...
由于其它原因,不想用 窗口消息/文件映射/socket 等进行跨进程通信,所以写了本例子,用的信号量及互斥体进行操作。 信号量可传递4/8/12字节数据。里面演示了4字节处理。8/12字节需要cha询句柄信息处理就不处理了,...
例如,在C++中我们使用vector做同样的事情,当数据在作用域不再使用时被自动调用的一种钩子函数:但是多数情况下更加复杂,特别是对象被多个线程跨线程共享,仅仅
这使您可以创建指针类型可参数化的数据结构,从而在不需要跨线程共享数据时可以避免Arc的开销。 在支持更高种类的多态性的语言中,无需任何库即可轻松实现,但锈尚不支持。 为了模仿更高种类的多态性,射箭采用了...
由于此类每次请求或设置属性时都会存储和恢复其数据,因此应用程序之间的数据始终是最新的。 并且因为 PHP 有一个很好的内置咨询锁功能,可以有任意数量的应用程序,没有对同步文件的并发访问。 用例 长时间运行的...
设置线程特定数据..............................................................................................................................31 3 获取线程特定数据........................................
2.在共享对象时(特别是在跨线程共享时),考虑使用不可变模型。3.考虑支持MVVM风格UI的单层和多层撤消。4.在实现属性变更通知时避免不必要的内存分配。5.不要覆盖模型的Equals和GetHashCode方法。在传统的MVC、MVP...
在共享对象时(特别是在跨线程共享时),考虑使用不可变模型。 考虑支持MVVM风格UI的单层和多层撤消。 在实现属性变更通知时避免不必要的内存分配。 不要覆盖模型的Equals和GetHashCode方法。 在传统的MVC、MVP、...
A、视图 B、表 C、数据 D、数据库 2、数据库的简称( B ) A、DA B、DB C、BD D、DD 3、( D )是指长期储存在计算机内的、有组织的、可共享的数据集合,以及数据之间的逻辑关系 的集合。 A、视图 B、数据 C、表 D、...
A、视图 B、表 C、数据 D、数据库 2、数据库的简称( B ) A、DA B、DB C、BD D、DD 3、( D )是指长期储存在计算机内的、有组织的、可共享的数据集合,以及数据之间的逻辑关系 的集合。 A、视图 B、数据 C、表 D、...
当父进程发现请求数 >= 子进程数时,父进程创建新的子进程,并把子进程数加1(当然子进程数有个预先上限);当父进程发现子进程数大于请求数加1时,父进程杀死多余的子进程。 总的来说,思想是让子进程accept并处理...
本文介绍了Java的线程编程中处理同步对象的恒定性、放置共享数据、同步的粒度、线程之间的通知、跨类的同步对象时应该注意的问题。
写作原因:跨进程通信的实现和理解是Android进阶中重要的一环。下面博主分享IPC一些相关知识、操作及自己在学习IPC过程中的...由于进程之间不能像线程一样共享内存,所以数据通信不能像线程一般进行。在Android中可以
删除线程特定数据键................................................................................................................. 30 3 设置线程特定数据..................................................
我们都知道 Java 源文件,通过编译器,能够生产相应的.Class 文件,也就是字节码文件, 而字节码文件又通过 Java 虚拟机中的解释器,编译成特定机器上的机器码 。 也就是如下: ...当线程结束时, 13/
应用程序数据共享,通过跨进程共享通用类的元数据,减少空间占用及启动时长。 线程本地握手,不执行全局 VM 安全点也能对线程执行回调,同时实现单线程停止回调。 JDK 提供了一组默认证书,开源 Java SE 的 CA程序...