Alex Rivera | Logout

Put one thread to sleep until a condition is resolved in another thread

Asked 2008-11-26T01:27:08.833
15

Here are two chunks of code that accomplish (what I think is) the same thing.

I basically am trying to learn how to use Java 1.5's concurrency to get away from Thread.sleep(long). The first example uses ReentrantLock, and the second example uses CountDownLatch. The jist of what I am trying to do is put one thread to sleep until a condition is resolved in another thread.

The ReentrantLock provides a lock on the boolean I'm using to decide whether to wake the other thread or not, and then I use the Condition with await/signal to sleep the other thread. As far as I can tell, the only reason I would need to use locks is if more than one thread required write access to the boolean.

The CountDownLatch seems to provide the same functionality as the ReentrantLock but without the (unnecessary?) locks. However, it feels like I am kind of hijacking its intended use by initializing it with only one countdown necessary. I think it's supposed to be used when multiple threads are going to be working on the same task, not when multiple threads are waiting on one task.

So, questions:

  1. Am I using locks for "the right thing" in the ReentrantLock code? If I am only writing to the boolean in one thread, are the locks necessary? As long as I reset the boolean before waking up any other threads I can't cause a problem, can I?

  2. Is there a class similar to CountDownLatch I can use to avoid locks (assuming I should be avoiding them in this instance) that is more naturally suited to this task?

  3. Are there any other ways to improve this code I should be aware of?

EXAMPLE ONE:

import java.util.concurrent.locks.*;

public class ReentrantLockExample extends Thread {

//boolean - Is the service down?
boolean serviceDown;

// I am using this lock to synchronize access to sDown
Lock serviceLock; 
// and this condition to sleep any threads waiting on the service.
Condition service
Edit
Report

1 Answer

2

The lock/condition variable approach is better for this task in my opinion. There is a similar example to yours here: http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/locks/Condition.html

In response to protecting a boolean. You could use volatile(http://www.ibm.com/developerworks/java/library/j-jtp06197.html). However the problem with not using Locks is that depending on how long your service is down for you will be spinning on while(isServiceDown()). By using a condition wait you tell the OS to sleep your thread until a spurious wake up (talked about in the java docs for Condition), or until the condition is signaled in the other thread.

answered 2008-11-26T02:51:57.070

Your Answer