Race condition in ThreadGroup stop test
David Holmes
david.holmes at oracle.com
Thu Nov 10 07:04:49 UTC 2011
Gary,
Did you test that this still fails on a JDK without the fix? AFAICS you
must start the threads in the correct order so that in the original bad
code the first thread in the ThreadGroup that would be stopped is
"first". Hence
64 // Launch two threads as part of the same thread group
65 second.start();
66 first.start();
needs to be reversed. It is the start() that adds the Thread to the
ThreadGroup's internal array.
David
On 10/11/2011 5:09 AM, Gary Adams wrote:
> Captured the latest round of comments
> - more readable initialization
> - allow sleep interruption to terminate main thread
> - added current CR# to @bug tag
>
> 24 /**
> 25 * @test
> 26 * @bug 4176355 7084033
> 27 * @summary Stopping a ThreadGroup that contains the current thread has
> 28 * unpredictable results.
> 29 */
> 30
> 31 public class Stop implements Runnable {
> 32 private static boolean groupStopped = false ;
> 33 private static final Object lock = new Object();
> 34
> 35 private static final ThreadGroup group = new ThreadGroup("");
> 36 private static final Thread first = new Thread(group, new Stop());
> 37 private static final Thread second = new Thread(group, new Stop());
> 38
> 39 public void run() {
> 40 while (true) {
> 41 // Give the other thread a chance to start
> 42 try {
> 43 Thread.sleep(1000);
> 44 } catch (InterruptedException e) {
> 45 }
> 46
> 47 // When the first thread runs, it will stop the group.
> 48 if (Thread.currentThread() == first) {
> 49 synchronized (lock) {
> 50 try {
> 51 group.stop();
> 52 } finally {
> 53 // Signal the main thread it is time to check
> 54 // that the stopped thread group was successful
> 55 groupStopped = true;
> 56 lock.notifyAll();
> 57 }
> 58 }
> 59 }
> 60 }
> 61 }
> 62
> 63 public static void main(String[] args) throws Exception {
> 64 // Launch two threads as part of the same thread group
> 65 second.start();
> 66 first.start();
> 67
> 68 // Wait for the thread group stop to be issued
> 69 synchronized(lock){
> 70 while (!groupStopped) {
> 71 lock.wait();
> 72 // Give the other thread a chance to stop
> 73 Thread.sleep(1000);
> 74 }
> 75 }
> 76
> 77 // Check that the second thread is terminated when the
> 78 // first thread terminates the thread group.
> 79 boolean failed = second.isAlive();
> 80
> 81 // Clean up any threads that may have not been terminated
> 82 first.stop();
> 83 second.stop();
> 84 if (failed)
> 85 throw new RuntimeException("Failure.");
> 86 }
> 87 }
>
More information about the core-libs-dev
mailing list