All Downloads are FREE. Search and download functionalities are using the official Maven repository.

xyz.downgoon.mydk.concurrent.ConditionTrafficLight Maven / Gradle / Ivy

package xyz.downgoon.mydk.concurrent;

import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * another implementation of {@link TrafficLight } with {@link Condition } on JDK5
 * @see	TrafficLight
 * */
public class ConditionTrafficLight implements BooleanSignal {

	private static final boolean RED_ON = false;
	private static final boolean GREEN_ON = true;

	private final Lock lock = new ReentrantLock();

	private final AtomicBoolean greenColor;

	private final Condition greenLight = lock.newCondition();

	/**
	 * green light is off on default
	 */
	public ConditionTrafficLight() {
		this(RED_ON);
	}

	/**
	 * @param isGreen
	 *            green light is on
	 */
	public ConditionTrafficLight(boolean isGreen) {
		this.greenColor = new AtomicBoolean(isGreen);
	}

	@Override
	public void setRed() {
		greenColor.set(false);
	}

	@Override
	public void setGreen() throws InterruptedException {
		boolean isRedBefore = greenColor.compareAndSet(RED_ON, GREEN_ON);
		if (isRedBefore) {
			lock.lock();
			try { // signal all on changed to Green from Red
				greenLight.signalAll();
			} finally {
				lock.unlock();
			}
		}
	}

	@Override
	public void waitGreen() throws InterruptedException {
		if (greenColor.get()) {
			return; // do nothing
		}

		lock.lock();
		try {
			// while (!greenColor.get()) {
			greenLight.await(); // no double-checking
			// }

		} finally {
			lock.unlock();
		}
	}

	@Override
	public boolean isGreen() {
		return greenColor.get();
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy