0

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);
}
Community
  • 1
  • 1
Amit Deshpande
  • 19,001
  • 4
  • 46
  • 72
  • 1
    Your question is incomprehensible. ConcurrentHashMap does not 'increase the number of locks in Java'. From 'below is example I'm which if I am doing' your post is unintelligible. – user207421 Oct 15 '12 at 07:32
  • Can you please refer to original question http://stackoverflow.com/questions/659915/synchronizing-on-an-integer-value. – Amit Deshpande Oct 15 '12 at 07:35
  • Can *you* please confine yourself to your original question, instead of double-posting it. – user207421 Oct 15 '12 at 09:17
  • @EJP Because this is entirely different context. context was limited in the previous question as in I referred some implementation which does not provide solution. So Now the question is there a different way. I don't know how you think these two things are same. I would love to hear from you if you know solution :) – Amit Deshpande Oct 15 '12 at 09:21
  • See also http://stackoverflow.com/questions/6616141/java-threads-locking-on-a-specific-object – rogerdpack Jan 06 '15 at 18:37

1 Answers1

4

Every Object in Java has an associated lock. If you want a new lock, you can create a new Object. 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 the int that doSomething 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 different ints? If not, you could just place both calls within a synchronized(this)

b) ints are not Objects. If you change doSomething to take an Integer and also change whatever's calling doSomething (and whatever's calling that, and so forth) to also use Integers, you can synchronize on the Integer. It's important here to make sure that every caller will be using the same Integer object - it's possible to have multiple Integers that have the same int value, but synchronizing on different Integers won't provide the protection you're looking for.

Jon Bright
  • 13,388
  • 3
  • 31
  • 46