将 LongPredicate(或类似)声明为私有静态而不是非静态 class 变量时的任何并发问题
Any concurrency issues in declaring a LongPredicate (or similar) as private static instead of non-static class variable
我已将 LongPredicate
声明为:
private LongPredicate isAboveZero = id -> id > 0L;
因为这是一个非捕获 lambda
不是更好地声明它为 static
吗?
另外,声明static
时,如果被多线程访问或者并行使用会不会有并发问题streams
?
如果您查看 specification on Lambda expressions,您会得到以下信息:
A lambda expression is like a method: ...
和
Evaluation of a lambda expression produces an instance of a functional interface.
这意味着你基本上得到了一个匿名 class 实现 LongPredicate
并且因为那个 class 只有一个方法并且没有状态它是线程安全的 - 除非该方法正在做非- 线程安全的东西,在您发布的表达式中不是这种情况。
这意味着可以将对 class 实例的引用存储在静态变量中。但是,您可能还希望将 isAboveZero
设置为最终版本,这样它就不会在运行时被替换(另请参阅我的评论)。
我已将 LongPredicate
声明为:
private LongPredicate isAboveZero = id -> id > 0L;
因为这是一个非捕获 lambda
不是更好地声明它为 static
吗?
另外,声明static
时,如果被多线程访问或者并行使用会不会有并发问题streams
?
如果您查看 specification on Lambda expressions,您会得到以下信息:
A lambda expression is like a method: ...
和
Evaluation of a lambda expression produces an instance of a functional interface.
这意味着你基本上得到了一个匿名 class 实现 LongPredicate
并且因为那个 class 只有一个方法并且没有状态它是线程安全的 - 除非该方法正在做非- 线程安全的东西,在您发布的表达式中不是这种情况。
这意味着可以将对 class 实例的引用存储在静态变量中。但是,您可能还希望将 isAboveZero
设置为最终版本,这样它就不会在运行时被替换(另请参阅我的评论)。