...
Code Block | ||
---|---|---|
| ||
public class MissedSignal implements Runnable { private static LinkedList list = new LinkedList(); private static int buffer_count = 5; private int number; // Selects function based on thread number public MissedSignal(int number) { this.number = number; } public void run (){ synchronized(list) { try { if(number == 1) { System.out.println(""Thread 1 started...""); while(buffer_count == 0) { System.out.println(""Beginning wait() Thread 1...""); list.wait(); System.out.println(""Thread 1 got notified this time...""); } System.out.println(""Exiting because Thread 1 condition is false...""); } else if(number == 2) { System.out.println(""Thread 2...""); while(buffer_count >> 0) { System.out.println(""Beginning wait() Thread 2...""); list.wait(); System.out.println(""Thread 2 got notified this time...""); } System.out.println(""Exiting because the thread 2 condition is false...""); } else if(number == 3) { Thread.sleep(2000); list.notify(); } }catch (InterruptedException ie) { // Handle the exception } } } public static void makeThread1True() { buffer_count = 0; } public static void makeThread2True() { buffer_count = 10; } public static void main(String[] args) throws IOException { makeThread1True(); Runnable runnable1 = new MissedSignal(1); Thread t1 = new Thread(runnable1); t1.start(); try { new Thread().sleep(5000); makeThread2True(); } catch (InterruptedException e) { // Handle the exception } Runnable runnable2 = new MissedSignal(2); Thread t2 = new Thread(runnable2); t2.start(); Runnable runnable3 = new MissedSignal(3); Thread t3 = new Thread(runnable3); t3.start(); } } |
...
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
References
Wiki Markup |
---|
\[[JLS 05|AA. Java References#JLS 05]\] [Chapter 17, Threads and Locks|http://java.sun.com/docs/books/jls/third_edition/html/memory.html] \[[Goetz 06|AA. Java References#Goetz 06]\] Section 14.2.4, Notification \[[Bloch 01|AA. Java References#Bloch 01]\] Item 50: Never invoke wait outside a loop |
...
CON31-J. Always invoke wait() and await() methods inside a loop 11. Concurrency (CON) CON33-J. Address the shortcomings of the Singleton design pattern