我有两个线程,每个都有自己的计数器:线程A有counterA,线程B有counterB。每个线程都必须使用两个计数器:线程A必须使用counterA和counterB,线程B也必须使用两者。 我正在使用AtomicInteger并在两个线程之间共享计数器,我将它们作为参数传递给线程,每个线程将两个计数器存储在私有字段中。
// ...
AtomicInteger counterA = new AtomicInteger(0);
AtomicInteger counterB = new AtomicInteger(0);
Thread tA = new Thread(new RunnableA(counterA, counterB));
Thread tB = new Thread(new RunnableB(counterA, counterB));
// ... in the constructor of RunnableA ...
RunnableA(AtomicInteger counterA, AtomicInteger counterB) {
this.counterA = counterA;
this.counterB = counterB;
}
//...
// The same for RunnableB
这是两个计数器的safe publishing吗? 安全发布是必要的,因为对对象的引用不够安全,无法在线程之间共享对象。 在这种情况下如何实现安全发布?
提前致谢。
答案 0 :(得分:1)
术语"安全出版物"不适用于此。安全发布是关于在构造函数中创建的状态的发布。在您的示例中,AtomicInteger
对象是在调用构造函数之前创建的。
如果使用其他类型,这可能会也可能不安全,具体取决于counterA
和counterB
变量是否以及如何发布。但是,如果将计数器实现为AtomicInteger
个对象,则不必担心发布。它们是原子/线程安全的,无论它们是如何发布的。唯一可能的关注可能是实例变量状态的发布。我们无法判断是否在没有看到班级其他人的情况下发生这种情况。例如:
final
还是volatile
?run()
被调用后是否被线程限制? 请注意,runnables将在当前线程中实例化,而不是在调用({if} tA.start()
和tB.start()
时创建的线程中实例化。调用start()
时,当前主持人的start()
来电和新主持人的run()
来电之间会有发生在之前。这意味着可以保证将变量安全地发布到子线程本身。它只是将变量发布到其他线程中。