java.util.Optional<T> 映射函数是线程安全的吗?如果是,我该如何测试?

Is java.util.Optional<T> map function thread-safe ? If yes, How can I test it?

我在 Java 方面经验不多,也没有在生产代码中使用过 java.util.Optional 映射函数。但是,我需要用它来实现一个用例,我想到的第一个想法是,这是线程安全的吗?只要参数中的映射函数是线程安全的,我们是否可以假设整个操作都是线程安全的? 我该如何测试?

感谢您的帮助。

谢谢。

Optional.map 与作为参数传入的函数一样线程安全。它所做的基本上是:

public <V> Optional<V> map(Function<? super T, ? extends V> fn) {
  if (isPresent()) {
    V value = fn.apply(get());
    if (value != null) {
      return Optional.of(value);
    }
  }
  return Optional.absent();
}

因为 Optional 是不可变的(意味着 isPresent()get() 总是 return 相同的值,并且值 return 由 get() 将被安全发布),这里唯一可能是线程不安全的是调用 fn.apply(get()).


As long as the mapping function in the argument is thread-safe, can we assume the overall operation will be thread safe ? How can I test this ?

好不容易。你不能真正编写测试来证明某些东西是线程安全的,因为你不能证明你没有观察到线程不安全的原因是因为你的代码的正确性,或者因为你的测试根本没有做任何会行使线程不安全性的事情。

您只能通过根据 Java 内存模型的属性对代码进行推理来做到这一点。

在一些情况下,我已经能够证明 class 或方法的线程不安全性,方法是生成两个或多个线程重复调用该方法,直到一个线程得到错误的结果或异常。正如 Andy Turner 已经说过的,即使该方法是线程不安全的,也不能保证您的测试会揭示它。在某些情况下它会在实践中。

因为Optional是不可变的,所以它是线程安全的。所以在这种情况下,您的测试将不会显示任何内容(除非您传递给 map() 的函数是线程不安全的)。因此,您必须自己决定这是否会让您比以前更加放心。