问题描述
我试图了解在多线程应用程序的类级别定义的谓词是否存在任何问题。 ?我们在服务中定义了此类谓词,并将它们用于同一类的不同方法。目前我们还没有看到任何问题,但是我很好奇我们的类级别的Predicate对象即将起作用。行为上会有不一致之处吗? 例如:
class SomeClass{
Predicate<String> check = (value) -> value.contains("SomeString");
// remaning impl. of the class.
}
解决方法
您的示例中的谓词绝对是线程安全的。它正在对本质上线程安全(且不可变)的对象调用方法。
尽管如此,这并不适用于所有谓词。例如
datatoedit
不是线程安全的。当该谓词检查它时,另一个线程可能会使Predicate<StringBuilder> check = (value) -> value.indexOf("SomeString") >= 0;
参数的内容发生变化。谓词也可能容易受到与内存模型相关的不一致的影响。
(StringBuilder
类不是线程安全的;请参见javadoc。)
“等级”是什么意思还不清楚。您的示例显示谓词声明为常规字段,而不是StringBuilder
(类级别)字段。
使用声明为(可变)实例字段的变量,很难独立地推断该字段的线程安全性。可以通过将字段声明为static
来解决。