相关疑难解决方法(0)

793
推荐指数
17
解决办法
30万
查看次数

用Java编写线程安全模块计数器

完全免责声明:这不是一个真正的功课,但我标记它是因为它主要是一个自学习练习而不是实际的"工作".

假设我想用Java编写一个简单的线程安全模块计数器.也就是说,如果模数M为3,那么计数器应该0, 1, 2, 0, 1, 2, … 无限循环.

这是一次尝试:

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicModularCounter {
    private final AtomicInteger tick = new AtomicInteger();
    private final int M;

    public AtomicModularCounter(int M) {
        this.M = M;
    }
    public int next() {
        return modulo(tick.getAndIncrement(), M);
    }
    private final static int modulo(int v, int M) {
        return ((v % M) + M) % M;
    }
}
Run Code Online (Sandbox Code Playgroud)

我对此代码的分析(可能有问题)是因为它使用AtomicInteger,即使没有任何显式synchronized方法/块,它也非常安全.

不幸的是,"算法"本身并不完全"工作",因为当tick环绕时Integer.MAX_VALUE,next()可能会返回错误的值,具体取决于模数M.那是: …

java concurrency multithreading thread-safety

17
推荐指数
2
解决办法
6764
查看次数

只有5个类的实例

我希望在整个应用程序生命周期中只有5个类的实例.我怎样才能做到这一点?如果可能,请提供示例代码.

java singleton

4
推荐指数
2
解决办法
6802
查看次数