1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * 4 * This code is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License version 2 only, as 6 * published by the Free Software Foundation. Oracle designates this 7 * particular file as subject to the "Classpath" exception as provided 8 * by Oracle in the LICENSE file that accompanied this code. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 */ 24 25 /* 26 * This file is available under and governed by the GNU General Public 27 * License version 2 only, as published by the Free Software Foundation. 28 * However, the following notice accompanied the original version of this 29 * file: 30 * 31 * Written by Doug Lea with assistance from members of JCP JSR-166 32 * Expert Group and released to the public domain, as explained at 33 * http://creativecommons.org/publicdomain/zero/1.0/ 34 */ 35 36 package java.util.concurrent; 37 38 import java.util.concurrent.locks.AbstractQueuedSynchronizer; 39 40 /** 41 * A synchronization aid that allows one or more threads to wait until 42 * a set of operations being performed in other threads completes. 43 * 44 * <p>A {@code CountDownLatch} is initialized with a given <em>count</em>. 45 * The {@link #await await} methods block until the current count reaches 46 * zero due to invocations of the {@link #countDown} method, after which 47 * all waiting threads are released and any subsequent invocations of 48 * {@link #await await} return immediately. This is a one-shot phenomenon 49 * -- the count cannot be reset. If you need a version that resets the 50 * count, consider using a {@link CyclicBarrier}. 51 * 52 * <p>A {@code CountDownLatch} is a versatile synchronization tool 53 * and can be used for a number of purposes. A 54 * {@code CountDownLatch} initialized with a count of one serves as a 55 * simple on/off latch, or gate: all threads invoking {@link #await await} 56 * wait at the gate until it is opened by a thread invoking {@link 57 * #countDown}. A {@code CountDownLatch} initialized to <em>N</em> 58 * can be used to make one thread wait until <em>N</em> threads have 59 * completed some action, or some action has been completed N times. 60 * 61 * <p>A useful property of a {@code CountDownLatch} is that it 62 * doesn't require that threads calling {@code countDown} wait for 63 * the count to reach zero before proceeding, it simply prevents any 64 * thread from proceeding past an {@link #await await} until all 65 * threads could pass. 66 * 67 * <p><b>Sample usage:</b> Here is a pair of classes in which a group 68 * of worker threads use two countdown latches: 69 * <ul> 70 * <li>The first is a start signal that prevents any worker from proceeding 71 * until the driver is ready for them to proceed; 72 * <li>The second is a completion signal that allows the driver to wait 73 * until all workers have completed. 74 * </ul> 75 * 76 * <pre> {@code 77 * class Driver { // ... 78 * void main() throws InterruptedException { 79 * CountDownLatch startSignal = new CountDownLatch(1); 80 * CountDownLatch doneSignal = new CountDownLatch(N); 81 * 82 * for (int i = 0; i < N; ++i) // create and start threads 83 * new Thread(new Worker(startSignal, doneSignal)).start(); 84 * 85 * doSomethingElse(); // don't let run yet 86 * startSignal.countDown(); // let all threads proceed 87 * doSomethingElse(); 88 * doneSignal.await(); // wait for all to finish 89 * } 90 * } 91 * 92 * class Worker implements Runnable { 93 * private final CountDownLatch startSignal; 94 * private final CountDownLatch doneSignal; 95 * Worker(CountDownLatch startSignal, CountDownLatch doneSignal) { 96 * this.startSignal = startSignal; 97 * this.doneSignal = doneSignal; 98 * } 99 * public void run() { 100 * try { 101 * startSignal.await(); 102 * doWork(); 103 * doneSignal.countDown(); 104 * } catch (InterruptedException ex) {} // return; 105 * } 106 * 107 * void doWork() { ... } 108 * }}</pre> 109 * 110 * <p>Another typical usage would be to divide a problem into N parts, 111 * describe each part with a Runnable that executes that portion and 112 * counts down on the latch, and queue all the Runnables to an 113 * Executor. When all sub-parts are complete, the coordinating thread 114 * will be able to pass through await. (When threads must repeatedly 115 * count down in this way, instead use a {@link CyclicBarrier}.) 116 * 117 * <pre> {@code 118 * class Driver2 { // ... 119 * void main() throws InterruptedException { 120 * CountDownLatch doneSignal = new CountDownLatch(N); 121 * Executor e = ... 122 * 123 * for (int i = 0; i < N; ++i) // create and start threads 124 * e.execute(new WorkerRunnable(doneSignal, i)); 125 * 126 * doneSignal.await(); // wait for all to finish 127 * } 128 * } 129 * 130 * class WorkerRunnable implements Runnable { 131 * private final CountDownLatch doneSignal; 132 * private final int i; 133 * WorkerRunnable(CountDownLatch doneSignal, int i) { 134 * this.doneSignal = doneSignal; 135 * this.i = i; 136 * } 137 * public void run() { 138 * try { 139 * doWork(i); 140 * doneSignal.countDown(); 141 * } catch (InterruptedException ex) {} // return; 142 * } 143 * 144 * void doWork() { ... } 145 * }}</pre> 146 * 147 * <p>Memory consistency effects: Until the count reaches 148 * zero, actions in a thread prior to calling 149 * {@code countDown()} 150 * <a href="package-summary.html#MemoryVisibility"><i>happen-before</i></a> 151 * actions following a successful return from a corresponding 152 * {@code await()} in another thread. 153 * 154 * @since 1.5 155 * @author Doug Lea 156 */ 157 public class CountDownLatch { 158 /** 159 * Synchronization control For CountDownLatch. 160 * Uses AQS state to represent count. 161 */ 162 private static final class Sync extends AbstractQueuedSynchronizer { 163 private static final long serialVersionUID = 4982264981922014374L; 164 Sync(int count)165 Sync(int count) { 166 setState(count); 167 } 168 getCount()169 int getCount() { 170 return getState(); 171 } 172 tryAcquireShared(int acquires)173 protected int tryAcquireShared(int acquires) { 174 return (getState() == 0) ? 1 : -1; 175 } 176 tryReleaseShared(int releases)177 protected boolean tryReleaseShared(int releases) { 178 // Decrement count; signal when transition to zero 179 for (;;) { 180 int c = getState(); 181 if (c == 0) 182 return false; 183 int nextc = c - 1; 184 if (compareAndSetState(c, nextc)) 185 return nextc == 0; 186 } 187 } 188 } 189 190 private final Sync sync; 191 192 /** 193 * Constructs a {@code CountDownLatch} initialized with the given count. 194 * 195 * @param count the number of times {@link #countDown} must be invoked 196 * before threads can pass through {@link #await} 197 * @throws IllegalArgumentException if {@code count} is negative 198 */ CountDownLatch(int count)199 public CountDownLatch(int count) { 200 if (count < 0) throw new IllegalArgumentException("count < 0"); 201 this.sync = new Sync(count); 202 } 203 204 /** 205 * Causes the current thread to wait until the latch has counted down to 206 * zero, unless the thread is {@linkplain Thread#interrupt interrupted}. 207 * 208 * <p>If the current count is zero then this method returns immediately. 209 * 210 * <p>If the current count is greater than zero then the current 211 * thread becomes disabled for thread scheduling purposes and lies 212 * dormant until one of two things happen: 213 * <ul> 214 * <li>The count reaches zero due to invocations of the 215 * {@link #countDown} method; or 216 * <li>Some other thread {@linkplain Thread#interrupt interrupts} 217 * the current thread. 218 * </ul> 219 * 220 * <p>If the current thread: 221 * <ul> 222 * <li>has its interrupted status set on entry to this method; or 223 * <li>is {@linkplain Thread#interrupt interrupted} while waiting, 224 * </ul> 225 * then {@link InterruptedException} is thrown and the current thread's 226 * interrupted status is cleared. 227 * 228 * @throws InterruptedException if the current thread is interrupted 229 * while waiting 230 */ await()231 public void await() throws InterruptedException { 232 sync.acquireSharedInterruptibly(1); 233 } 234 235 /** 236 * Causes the current thread to wait until the latch has counted down to 237 * zero, unless the thread is {@linkplain Thread#interrupt interrupted}, 238 * or the specified waiting time elapses. 239 * 240 * <p>If the current count is zero then this method returns immediately 241 * with the value {@code true}. 242 * 243 * <p>If the current count is greater than zero then the current 244 * thread becomes disabled for thread scheduling purposes and lies 245 * dormant until one of three things happen: 246 * <ul> 247 * <li>The count reaches zero due to invocations of the 248 * {@link #countDown} method; or 249 * <li>Some other thread {@linkplain Thread#interrupt interrupts} 250 * the current thread; or 251 * <li>The specified waiting time elapses. 252 * </ul> 253 * 254 * <p>If the count reaches zero then the method returns with the 255 * value {@code true}. 256 * 257 * <p>If the current thread: 258 * <ul> 259 * <li>has its interrupted status set on entry to this method; or 260 * <li>is {@linkplain Thread#interrupt interrupted} while waiting, 261 * </ul> 262 * then {@link InterruptedException} is thrown and the current thread's 263 * interrupted status is cleared. 264 * 265 * <p>If the specified waiting time elapses then the value {@code false} 266 * is returned. If the time is less than or equal to zero, the method 267 * will not wait at all. 268 * 269 * @param timeout the maximum time to wait 270 * @param unit the time unit of the {@code timeout} argument 271 * @return {@code true} if the count reached zero and {@code false} 272 * if the waiting time elapsed before the count reached zero 273 * @throws InterruptedException if the current thread is interrupted 274 * while waiting 275 */ await(long timeout, TimeUnit unit)276 public boolean await(long timeout, TimeUnit unit) 277 throws InterruptedException { 278 return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout)); 279 } 280 281 /** 282 * Decrements the count of the latch, releasing all waiting threads if 283 * the count reaches zero. 284 * 285 * <p>If the current count is greater than zero then it is decremented. 286 * If the new count is zero then all waiting threads are re-enabled for 287 * thread scheduling purposes. 288 * 289 * <p>If the current count equals zero then nothing happens. 290 */ countDown()291 public void countDown() { 292 sync.releaseShared(1); 293 } 294 295 /** 296 * Returns the current count. 297 * 298 * <p>This method is typically used for debugging and testing purposes. 299 * 300 * @return the current count 301 */ getCount()302 public long getCount() { 303 return sync.getCount(); 304 } 305 306 /** 307 * Returns a string identifying this latch, as well as its state. 308 * The state, in brackets, includes the String {@code "Count ="} 309 * followed by the current count. 310 * 311 * @return a string identifying this latch, as well as its state 312 */ toString()313 public String toString() { 314 return super.toString() + "[Count = " + sync.getCount() + "]"; 315 } 316 } 317