【发布时间】:2016-11-14 21:11:51
【问题描述】:
我正在尝试计算在多线程环境下进程运行时生成的类实例的数量。我这样做的方法是通过查看这篇文章来增加构造函数中的静态计数器: How to Count Number of Instances of a Class
所以在多线程环境中,我是这样定义类的:
class Television {
private static volatile int counter = 0;
public Television(){
counter ++;
}
}
但是,我不确定上面的代码是否存在潜在的错误,因为我认为 java 中的构造函数并不意味着同步 并且counter++ 不是原子的因此,如果两个线程同时创建实例,代码是否是某种错误?但我还不太确定。
【问题讨论】:
-
正确,有一个错误,因为计数器的读取和写入计数器不是原子执行的。使用
AtomicInteger。 -
使用原子计数器。教程/基本/并发/atomicvars.html
-
当然还有;一个有趣的问题是:你为什么要这样做?通过了解实例数,您打算解决什么样的问题?
-
@GhostCat 很好,它偶尔有用(非常偶尔);我的问题是为什么让它成为
Television的静态属性,而不是TelevisionFactory的实例变量。可变的全局状态是纯粹的邪恶。 -
@AndyTurner 非常感谢,这很有趣。您能解释一下如何使用 TelevisionFactory 进行计数吗?
标签: java multithreading