如何编写一个计算被调用次数的消费者?

时间:2014-05-15 16:38:45

标签: java concurrency java-8

我需要(主要是出于测试目的)编写一个消费者,其目的是记住调用它的次数。但是,我做不到

    int i = 0;
    Consumer<Object> handler = o -> i++;

因为i必须是最终的,我不能增加最终变量。我想我需要类似MutableInteger类的东西。那么正确的计算方法是什么?编写我自己的新类或新方法只是为了正确的方法。

3 个答案:

答案 0 :(得分:12)

使用AtomicInteger使用CAS实现。

AtomicInteger有一个incrementAndGet()方法可用于此目的。

知道JDK中有更多Atomic*个变体也很有用,因此如果AtomicLong对您来说还不够Integer

答案 1 :(得分:3)

你永远不能那样做。即使匿名课程不起作用。你需要一些允许你保持状态的对象包装器,比如

class NumberOfInvocations {
    private int i = 0;

    public void increment(){
       i +=1;
    }
}

但你必须确保一切都是线程安全的,或者你可以按照Adam的建议使用AtomicInteger。

答案 2 :(得分:0)

出于测试目的(您知道访问是单线程的),一种快速而肮脏的解决方法是:

int[] i = new int[]{0};
Consumer<Object> handler = o -> i[0]++;