小编Hit*_*esh的帖子

将ThreadLocal与ExecutorService一起使用是危险的吗?

我在下面的博客上看到了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一起使用.只有当我们完全控制哪个线程将选择要执行哪个可运行动作时,才应该使用它."

这个解释对我来说是一个保镖.我特意在网上做了一些研究,但是我得不到多少帮助,有些专家请详细说明上述解释吗?它是作者观点还是真正的威胁?

java multithreading thread-local

8
推荐指数
2
解决办法
1812
查看次数

java 8 顺序流是否有任何直接或间接的性能优势?

在浏览顺序流的文章时,我想到了一个问题,即使用顺序流相对于传统的 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也是如此,那么除了“富有表现力”和“优雅”编码之外,使用流的动机应该是什么风格?我知道编译器在处理流时会有性能开销,有没有人知道/体验过使用顺序流时的任何性能优势?

java java-8

5
推荐指数
1
解决办法
461
查看次数

返回第一个的函数Non-None可选

我正在尝试编写一个接受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)

scala

1
推荐指数
1
解决办法
53
查看次数

标签 统计

java ×2

java-8 ×1

multithreading ×1

scala ×1

thread-local ×1