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;
}**
}
if I'll run few threads, some of them call the static function getCount()
and some of them create new instances. I want to get in each call to getCount()
the real number of instances at the time.
- Is there a difference between the two options in the code?
- If I lock "
this
" shouldn't it mean that I can't callgetCount()
until the constructor exits the synchronized block (lets say if I don't write synchronize on the getCount()). - if I do a synchronized block in some place in the code, does it lock only the synchronized block or all the "
this
" code? - From here down EDIT: thank you all, it was very helpful, but I have a few more questions following your answers.
- If I understand correctly, the synchronized(this) block doesn't effect (or connected to) the static synchronized function (in lock terms not the numOfInstances increment)?
- is there a better option to make the increment and the getCount() function Thread-safe? (like open a static object and do synchronized(obj) instead synchronized(this) - friend suggested).
- If I had a f1() method (non-static) in ObjectCounter class, while one thread is in the synchronized(this) can other thread enter f1() block (not a synchronized class or have synchronized block inside)?
- If I had a f1() method (non-static) and f2() method (non-static) in ObjectCounter, in f1() I have synchronized(this) block. while one thread is in the synchronized(this) block, can other thread enter f1() block (not a synchronized class or have synchronized block inside)? (lets say both of the threads "working" on the same instance)
`
getCount()
) of any object before the constructor for that instance has returned. The only way that's even possible is if the constructor publishesthis
to another thread. (also known as "leaking this from a constructor"). If you think you have to writesynchronized(this)
inside a constructor, then you probably are making a huge mistake. – Meda