Threads calling non-static synchronized methods in the same class will only block each other if they're invoked using the same instance. That's because they each lock on 'this' instance, and if they're called using two different instances, they get two locks, which do not interfere with each other.
Is 1 & 2 are two different instances or same instances?
I'm not 100% sure i understand your question. When you use the "new" keyword you are instantiating a new instance of an object. So //1 & //2 are different instances.
With regards to the lock on dostuff... first of all your class doesn't compile (pubic == public) second you must implement the run() method (not the Run() method) and third you are not try to access do stuff in this program. To do so you need to do one of 2 things:
1. Call the run() method from the class, this will cause it to be a regular method call and no new threads will spawn. 2. You can wrap your class with a Thread object and call the start() method on that object (see Sun guide), this will span 2 separate threads that will call dostuff synchronously (because you used the synchronized key word on the method) so there won't be a deadlock or a race condition....
Perhaps write some code in the run method that needs some time when you test synchronization. And also (just an idea) add a yield() to give other threads a chance. That might look silly, as the synchronized keyword simply would not allow the yielding. But it is then more interesting to compare the behavior of the code with / without the synchronized. Again: Just an idea.
And: Noam wrote:
With regards to the lock on dostuff... first of all your class doesn't compile (pubic == public)
Welcome to the Ranch, Noam!
Yes, all interface methods have to be public. But for that pubic things, the private keyword would be more appropriate... (Sorry couldn't resist )