Hi,
   The synchronize call may deadlock due to thread starvation. This is present
in all versions of java on all platforms i could test (jdk 1.1 thru 1.4b 
on win/sol/lin)
Example code for interlock.java is as follows :
import java.io.*;
import java.lang.*;
public class interlock{
public static int test=0; // 0 - test java synchronize. 1 - test java regular
private static boolean atomic_spinlock1=false;
private static boolean atomic_spinlock2=false; public interlock(){}
public static void main(String[] args) throws InterruptedException {
log("InterlockTest : If this code completes test was a success."); 
if(args.length==1){test=Integer.valueOf(args[0]).intValue();} 
new interlock().startup();} 
public static void log(String s){ System.err.println(">"+s); }
public static void blink(int 
i){try{Thread.currentThread().sleep(10+i);}catch(Exception 
e){}}
public static void spinlock1_rel(){atomic_spinlock1=false;}
public static boolean spinlock1_set(){ 
if (atomic_spinlock1==false) { atomic_spinlock1=true; return true; } else 
{ return false; } }
public static void spinlock2_rel(){atomic_spinlock2=false;}
public static boolean spinlock2_set(){ 
if (atomic_spinlock2==false) { atomic_spinlock2=true; return true; } else 
{ return false; } }
public static synchronized void s_spinlock1_rel(){atomic_spinlock1=false;}
public static synchronized boolean s_spinlock1_set(){ 
if (atomic_spinlock1==false) { atomic_spinlock1=true; return true; } else 
{ return false; } }
public static synchronized void s_spinlock2_rel(){atomic_spinlock2=false;}
public static synchronized boolean s_spinlock2_set(){ 
if (atomic_spinlock2==false) { atomic_spinlock2=true; return true; } else 
{ return false; } }
private void startup() { if (test==0) {log("Testing atomic spinlocks with 
Java Virtual Machine sync.... "); } 
else {log(" Testing atomic spinlocks without Java Virtual Machine sync...");}
Runner y=new Runner(0);Runner s=new Runner(1); y.start();blink(100);s.start(); 
}
class Runner extends Thread implements Runnable{ private int runr=0;
Runner(int seq) { runr=seq; } public void run() { log(" Started runner "+runr+" 
-- ");
log(runr+": Setting atomic spinlock 1..."); 
if (test!=0){while(spinlock1_set()==false){}} else { while(s_spinlock2_set()==false){} 
} 
log(runr+": Set spinlock 1. Now sleeping... ");
blink(1000); log(runr+": Finished sleeping. Now setting spinlock 2... (if 
bug exists it will hang here...) ");
if (test!=0){while(spinlock2_set()==false){}} else { while(spinlock2_set()==false){} 
}
log(runr+": Spinlock 2 set. Now unsetting both spinlocks... ");
if (test!=0){spinlock2_rel(); spinlock1_rel();}else{s_spinlock2_rel(); 
s_spinlock1_rel();}
log(runr+": Completed. ");      }}                      }
....
BTW, my email has changed. 
[EMAIL PROTECTED] --> [EMAIL PROTECTED]
Thanks.
-Ys-

Free, encrypted, secure Web-based email at www.hushmail.com

Reply via email to