my dog learned polymorphism
The moose likes Threads and Synchronization and the fly likes Thread synchronization for Static factory method Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login

Win a copy of Make it so: Java DB Connections & Transactions this week in the JDBC forum!
JavaRanch » Java Forums » Java » Threads and Synchronization
Bookmark "Thread synchronization for Static factory method" Watch "Thread synchronization for Static factory method" New topic

Thread synchronization for Static factory method

Siva Masilamani
Ranch Hand

Joined: Sep 19, 2008
Posts: 385

I am trying to understand if I should synchronize the below factory method.I tested the code with three sample thread and I am always getting the correct object for each thread(meaning Thread 1 always shows TYPE1,thread2 always show TYPE2 and thread3 always shows TYPE3 but I am still thinking that this may not be the case always unless I synchronize the factory method else it will not be thread safe meaning thread 1 could get type 2 or type 3 also.

Also another option is moving the static field b inside method so that it will be a local variable.

Please correct me If am wrong.

Thanks in advance.

Factory Class:


Failure is not an option.
Jayesh A Lalwani
Saloon Keeper

Joined: Jan 17, 2008
Posts: 2723

If you want to reproduce the error, you will need more than a 100 iterations in the loop. It could be that 100 loops run so fast that the first thread is done before the second starts

Making b into a local variable is a much better option. Each thread will get it's own variable.
Siva Masilamani
Ranch Hand

Joined: Sep 19, 2008
Posts: 385
Thanks for your input but I was able to prove that this is not threadsafe (atleast in this case) by adding Thread.sleep(200) in the Facotry method and I see that thread started getting wrong object.
Mike Simmons
Ranch Hand

Joined: Mar 05, 2008
Posts: 3028
Excellent. But Jayesh's other point stands. Your class field b is completely unnecessary and should be removed; it's the source of the bug you're observing. I would also recommend making the binders variable final. That's not strictly necessary for a static field, but good practice (and prevents anyone else from changing it without realizing it's supposed to be constant). If the field were non-static, then making it final would be necessary in order to access it in a thread-safe manner without synchronization.
I agree. Here's the link:
subject: Thread synchronization for Static factory method
It's not a secret anymore!