public class ObjectCounter {
private static long numOfInstances = 0;
public ObjectCounter(){
synchronized(this){
numOfInstances++;
}
}
**public static synchronized long getCount(){
return numOfInstances;
}**
//vs//
**public static long getCount(){
return numOfInstances;
}**
}
如果我将运行几个线程,其中一些调用静态函数getCount()
,其中一些创建新实例。我想在每次调用时访问getCount()
实际实例数。
- 代码中的两个选项有区别吗?
- 如果我锁定“
this
”不应该意味着在构造函数退出同步块之前我不能调用getCount()
(假设我不在 getCount() 上写同步)。 - 如果我在代码中的某个位置执行同步块,它是只锁定同步块还是锁定所有“
this
”代码? - 从这里开始编辑:谢谢大家,这非常有帮助,但是在您的回答之后我还有一些问题。
- 如果我理解正确, synchronized(this) 块不会影响(或连接到)静态同步函数(在锁定术语中不是 numOfInstances 增量)?
- 是否有更好的选择来使增量和 getCount() 函数线程安全?(比如打开一个静态对象并做 synchronized(obj) 而不是 synchronized(this) - 朋友建议)。
- 如果我在 ObjectCounter 类中有一个 f1() 方法(非静态),而一个线程在 synchronized(this) 中,其他线程可以进入 f1() 块(不是同步类或内部有同步块)吗?
- 如果我在 ObjectCounter 中有 f1() 方法(非静态)和 f2() 方法(非静态),则在 f1() 中我有 synchronized(this) 块。当一个线程在 synchronized(this) 块中时,其他线程可以进入 f1() 块(不是同步类或内部有同步块)吗?(假设两个线程在同一个实例上“工作”)
`