【发布时间】:2019-11-21 22:17:39
【问题描述】:
我查看了 java 8 文档,发现 Pattern 类有 asPredicate 方法。
我正在查看 StackOverflow,但没有找到任何与线程安全相关的内容。
我知道 Pattern 类正如文档所说的那样是线程安全的
这个类的实例是不可变的,并且可以安全地被多个并发线程使用。 Matcher 类的实例对于这种使用是不安全的。
但是,asPredicate 方法生成的 Predicate 会发生什么?
【问题讨论】:
-
一个谓词只提供一个值。它没有可以更改的状态。所以它是不可变的,因此是线程安全的。
-
线程安全大多没有记录。但这可能会有所帮助:stackoverflow.com/questions/1360113/is-java-regex-thread-safe
-
@Eugene 好吧。如果
asPredicate方法确实是Matcher的方法,那么您是对的。但事实并非如此!这是Pattern的一个方法,是线程安全的。 -
@Seelenvirtuose 从概念上讲你是对的:谓词不应该有状态,甚至不应该改变任何状态。但如果使用不当,可能会改变谓词主体使用的对象状态,从而破坏线程安全。
asPattern()当然不关心。 -
@davidxxx 你是对的。我在
Pattern(与Matcher)的上下文中发表了我的评论,后来意识到OP确实搞砸了这两个类。我无法再编辑评论,所以我保持原样。