我正在努力了解在多线程应用程序的类级别定义的谓词是否存在任何问题?我们在服务中定义了这样的谓词,并在同一类的不同方法中使用它们。目前我们还没有看到任何问题,但我很想了解我们的类级谓词对象将如何工作。这种行为会前后矛盾吗?例如:
class SomeClass{
Predicate<String> check = (value) -> value.contains("SomeString");
// remaning impl. of the class.
}
示例中的谓词是绝对线程安全的。它在内部线程安全(并且是不可变的(对象上调用一个方法。
不过,这并不能推广到所有谓词。例如
Predicate<StringBuilder> check = (value) -> value.indexOf("SomeString") >= 0;
不是线程安全的。当该谓词检查StringBuilder
参数时,另一个线程可能会使其内容发生变化。该谓词也可能容易受到与内存模型相关的不一致的影响。
(StringBuilder
类不是线程安全的;请参阅javadoc。(
你所说的";等级";。您的示例显示了一个声明为常规字段的谓词,而不是static
(类级别(字段。
由于变量被声明为(可变(实例字段,因此很难单独推断该字段的线程安全性。这可以通过将字段声明为final
来解决。