Java 将LongPredicate(或类似)声明为私有静态类变量而不是非静态类变量时出现的任何并发问题
我已将一个Java 将LongPredicate(或类似)声明为私有静态类变量而不是非静态类变量时出现的任何并发问题,java,lambda,static,java-stream,predicate,Java,Lambda,Static,Java Stream,Predicate,我已将一个长谓词声明为: private longzero=id->id>0L; 既然这是一个非捕获的lambda,那么将其声明为静态不是更好吗 另外,当声明为静态时,如果由多个线程访问或与并行流一起使用,是否会出现任何并发问题?如果您查看 lambda表达式类似于方法: 及 lambda表达式的求值生成函数接口的实例 这意味着您基本上得到了一个实现LongPredicate的匿名类,因为该类只有一个方法,没有状态,所以它是线程安全的——除非该方法执行的是非线程安全的操作,而您发布的表达式中没
长谓词
声明为:
private longzero=id->id>0L;
既然这是一个非捕获的lambda
,那么将其声明为静态
不是更好吗
另外,当声明为静态
时,如果由多个线程访问或与并行流一起使用,是否会出现任何并发问题?如果您查看
lambda表达式类似于方法:
及
lambda表达式的求值生成函数接口的实例
这意味着您基本上得到了一个实现LongPredicate
的匿名类,因为该类只有一个方法,没有状态,所以它是线程安全的——除非该方法执行的是非线程安全的操作,而您发布的表达式中没有这种情况
这意味着可以将对该类实例的引用存储在静态变量中。但是,您可能还希望将isAboveZero
设置为final,这样就不能在运行时替换它(也请参见我的评论)。好吧,您的lambda将导致一个匿名类实现LongPredicate
,并且由于该类没有任何状态,因此lambda本身不应该涉及并发问题。顺便说一句,我假设isAboveZero
在运行时永远不会更改,因此您不妨声明它final
“在类级别”意味着静态
,因此,是否最好声明它静态
,这是一个奇怪的问题。如果没有static
,它就不是类级别的,并且会在类的每个实例中浪费内存。关于并发性,正如Thomas所说,没有问题,如果有问题,你也有问题,就像没有静态
一样,每个实例中都有一个不同的引用变量,但实际上它仍然引用相同的谓词
对象。@Thomas我想你可以加上这个作为答案