wood burning stoves 2.0*
The moose likes Threads and Synchronization and the fly likes Synchronization issue Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Java 8 in Action this week in the Java 8 forum!
JavaRanch » Java Forums » Java » Threads and Synchronization
Bookmark "Synchronization issue" Watch "Synchronization issue" New topic
Author

Synchronization issue

binayakumar patel
Greenhorn

Joined: Jun 26, 2009
Posts: 27
I have a function which will call by more then one thread, Which is synchronized by an referance of class ClientSession. So idea behind is that the two client reqiest will process parallaly. The problem is that the wating thread are getting active randomly not the oder it called the function.

Ex: Suppose for Client 1 there are 5 threads suppose T1,T2,T3,T4,T5
When the thread T1 is executing the T2,T3,T4,T5 is wating.... When T1 is finised it task and release the lock.... then next Thread is execution randlomly.... I cant accept T2 will call.. But as per the requirement T2 will call then T3 then T4 then T5.

Please suggest me the solution.

Thanks in advance
Binaya
Henry Wong
author
Sheriff

Joined: Sep 28, 2004
Posts: 18133
    
  39

This sounds like this could be done better without starting your own threads. For example, instead of having 5 threads named T1, T2, T3, T4, and T5. You could design it to use one thread (or an executor that is limited to one thread), and T1, T2, T3, T4, and T5 are just runnable tasks that is placed into the queue of the executor... The executor will execute it in the correct order for you.

Now, on the other hand, if you really don't want to change your design too much, you can try the ReentrantLock class. That class supports a "fairness" policies that, when set, tries to give locks in the order encountered.

Henry


Books: Java Threads, 3rd Edition, Jini in a Nutshell, and Java Gems (contributor)
Steve Luke
Bartender

Joined: Jan 28, 2003
Posts: 3967
    
  17

Well, that is how the synchronized blocks and wait/notify works. You won't be able to execute the tasks in order using these mechanisms.

You will probably be better off run the task in a single Thread which takes request in a Queue. Perhaps use a single threaded ThreadPoolExecutor (like one from Executors newSingleThreadExecutor() method). Then when T1 needs to call the method it submits()s a request and waits on the response (using the Future object's get() method).


Steve
Anas Alam
Greenhorn

Joined: Dec 03, 2007
Posts: 1
try using the join method. it might help!
binayakumar patel
Greenhorn

Joined: Jun 26, 2009
Posts: 27
Join will not help because; it will wait all other thread which is lock by object finished and then start.
But My issue is thread are not get active as the order it is waiting.
Ex-> Thread-1 lock first, then Thread-2 is waiting, after the Thread2 reached and waiting the Thread-3 comes and is waiting, similarly Thread-4 is waiting.

So I need Thread-2 will get active not Thread-3 or not Thread-4 when Thread-1 is released the lock, but it is not happening, any one of the Waiting thread is getting active and executing.
Ireneusz Kordal
Ranch Hand

Joined: Jun 21, 2008
Posts: 423
Hi,

you can create a simple "fair" semaphore: java.util.concurrent.Semaphore
The semaphore constructor has "fainress" parameter, which when set to true guarantees the same order of releasing threads waiting on it
as the order the threads called 'acquire' method.
You must create one semaphore for each session, and in the function you could call it in this way:


You must ensure that each thread will always call release() method on the semaphore, even in case of error/exception
... if not, the other threads will hang forever
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: Synchronization issue
 
Similar Threads
form validation
Lease pattern
Locking & Synchronization on Bodgitt & Scarper
Thread states, notify, notifyAll, wait
How to invoke a particular thread to run amongst many threads of same priority