Java在线程之间共享引用

时间:2017-10-17 17:29:59

标签: java spring multithreading

我们正在寻找Java(在spring框架上下文中)的库/功能,用于在线程之间传递引用:

//ParentThread:
XXX.putSharedObject("lock", childLock);
XXX.putSharedObject("someKey", someObjectInstance);
for(i=0;i<X;i++) { taskExecutor.execute(context.getBean("childClass")); }
childLock.wait(xxx);

//ChildThread:
YY = XXX.getSharedObject("someKey");
YY.someFunction();
...some work...
XXX.getSharedObject("lock").notify();

这样,线程(ParentThread)在XXX中设置的任何引用只能由'ParentThread'及其中的任何子项访问,而不能访问其他'ParentThreads'或其子项。

这可能吗? (我相信Mapped Diagnostic Context在日志框架中的工作方式)

由于

2 个答案:

答案 0 :(得分:1)

像这样工作(M. le Rutte的赞美):

//ParentRunnable:
public static final InheritableThreadLocal<SomeObjectType> YY = new InheritableThreadLocal<SomeObjectType>();

@Override
public void run() {
  ...
  YY.set(someObjectInstance);
  logger.debug("InParent: {}", YY.get());
  for(i=0;i<X;i++) { taskExecutor.execute(context.getBean("childClass")); }
}


//ChildRunnable:
@Override
public void run() {
  logger.debug("InChild: {}", ParentRunnable.YY.get());
}

很好的部分也是:

@Override
protected SomeObjectType initialValue()

可以在“set()”之前提前调用“get()”提示异常,或使用应用程序上下文获取原型bean,该bean用作子代之间的单例。

希望这对需要它的人有用(并且希望也能正确写出)

答案 1 :(得分:0)

使用同步类甚至块或方法可以通过线程安全来实现Java共享引用。这样,您可以在线程(Parent,child ...)之间共享给定对象,并保证线程安全。