【问题标题】:Is it safe to use Class level Predicate in Multithreading Application在多线程应用程序中使用类级别谓词是否安全
【发布时间】:2020-12-08 12:47:25
【问题描述】:

我试图了解在多线程应用程序的类级别定义的 Predicate 是否存在任何问题。 ?我们已经在我们的服务中定义了这样的谓词,并在同一类的不同方法中使用它们。目前我们还没有看到任何问题,但我很想了解我们的类级别 Predicate 对象将起作用。行为会有任何不一致吗? 例如:

class SomeClass{

      Predicate<String> check = (value) -> value.contains("SomeString");
      // remaning impl. of the class.
}

【问题讨论】:

  • 没有问题。这些实际上是纯函数,不会修改输入并且没有副作用。
  • 你认为会有什么问题?你认为它是如何工作的?

标签: multithreading java-8 predicate class-variables


【解决方案1】:

您示例中的谓词绝对是线程安全的。它在本质上是线程安全(且不可变)的对象上调用方法。

但这并不能推广到所有谓词。例如

Predicate<StringBuilder> check = (value) -> value.indexOf("SomeString") >= 0;

不是线程安全的。另一个线程可能会在此谓词检查时更改 StringBuilder 参数的内容。谓词也可能容易受到与内存模型相关的不一致的影响。

StringBuilder 类不是线程安全的;请参阅javadoc。)


不清楚您所说的“班级级别”是什么意思。您的示例显示了一个声明为常规字段的谓词,而不是 static(类级别)字段。

使用声明为(可变)实例字段的变量,很难单独推断该字段的线程安全性。这可以通过将字段声明为final 来解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多