This question is based on Synchronizing on an Integer results in NullPointerException and originated from this question Synchronizing on an Integer value
I wanted to know what is the best way to increase number of locks in Java. Other than which is implemented in ConcurrentHashMap
i.e. Based on Fixed array and by calculating hash of key to refer index of array?
Below is what is expected.
If doMoreThing()
for one object is in process then I should not do doAnotherThing()
for the same object if it called from different thread.
public void doSomething(int i) {
doAnotherThing(i);// some checks here based on it it will call to
// doMoreThing
doMoreThing(i);
}
Every
Object
in Java has an associated lock. If you want a new lock, you can create a newObject
. The referenced question doesn't make it clear why you're trying to increase the number of locks, or what you mean by that. Maybe you can provide more details.Update following changed question
I think I see what you're aiming at: effectively, you want a
synchronized
block on theint
thatdoSomething
is getting passed. There are two relatively simple ways to do what you're after:a) Is it really important that several threads be able to call
doSomething
simultaneously with differentint
s? If not, you could just place both calls within asynchronized(this)
b)
int
s are notObject
s. If you changedoSomething
to take anInteger
and also change whatever's callingdoSomething
(and whatever's calling that, and so forth) to also useInteger
s, you can synchronize on theInteger
. It's important here to make sure that every caller will be using the sameInteger
object - it's possible to have multipleInteger
s that have the sameint
value, but synchronizing on differentInteger
s won't provide the protection you're looking for.