Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Edited by sciSpider Java v3.0

...

Code Block
bgColor#FFcccc
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