我在下面的博客上看到了ThreadLocals的概念:
https://www.baeldung.com/java-threadlocal
它说"不要将ThreadLocal与ExecutorService一起使用"
它说明了下面使用ThreadLocals的示例.
public class ThreadLocalWithUserContext implements Runnable {
private static ThreadLocal<Context> userContext
= new ThreadLocal<>();
private Integer userId;
private UserRepository userRepository = new UserRepository();
@Override
public void run() {
String userName = userRepository.getUserNameForUserId(userId);
userContext.set(new Context(userName));
System.out.println("thread context for given userId: "
+ userId + " is: " + userContext.get());
}
// standard constructor
}
Run Code Online (Sandbox Code Playgroud)
在帖子的最后,它提到:
"如果我们想使用ExecutorService并向其提交Runnable,那么使用ThreadLocal将产生非确定性结果 - 因为我们无法保证每次给定userId的每个Runnable操作都将由同一个线程处理执行.
因此,我们的ThreadLocal将在不同的userId之间共享.这就是为什么我们不应该将TheadLocal与ExecutorService一起使用.只有当我们完全控制哪个线程将选择要执行哪个可运行动作时,才应该使用它."
这个解释对我来说是一个保镖.我特意在网上做了一些研究,但是我得不到多少帮助,有些专家请详细说明上述解释吗?它是作者观点还是真正的威胁?
在浏览顺序流的文章时,我想到了一个问题,即使用顺序流相对于传统的 for 循环或流是否有任何性能优势,或者流只是具有额外性能开销的顺序语法糖?
考虑以下示例,其中我看不到使用顺序流的任何性能优势:
Stream.of("d2", "a2", "b1", "b3", "c")
.filter(s -> {
System.out.println("filter: " + s);
return s.startsWith("a");
})
.forEach(s -> System.out.println("forEach: " + s));
Run Code Online (Sandbox Code Playgroud)
使用经典Java:
String[] strings = {"d2", "a2", "b1", "b3", "c"};
for (String s : strings)
{
System.out.println("Before filtering: " + s);
if (s.startsWith("a"))
{
System.out.println("After Filtering: " + s);
}
}
Run Code Online (Sandbox Code Playgroud)
这里的重点是 a2 的流处理仅在 d2 上的所有操作完成后才开始(之前我认为当 d2 由 foreach 处理时,filter 会在 a2 上进行操作,但根据本文,情况并非如此:https: //winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/),经典java也是如此,那么除了“富有表现力”和“优雅”编码之外,使用流的动机应该是什么风格?我知道编译器在处理流时会有性能开销,有没有人知道/体验过使用顺序流时的任何性能优势?
我正在尝试编写一个接受3个可选值并返回第一个非无可选值的函数。我的代码可以正常工作,但是看起来有点笨拙,想知道是否有更好的方法可以做到这一点。下面是我的代码
def firstNotNone[T](x: Option[T], y: Option[T], z: Option[T]): Option[T] = x.getOrElse(y.getOrElse(z.getOrElse(None))) match {
case None =>None
case value :T => Option(value)
}
Run Code Online (Sandbox Code Playgroud)