You do know your code has a typo that will cause deadlocks, don't you? See below... [EMAIL PROTECTED] wrote: > > 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){} Note in the line above that test!=0 is setting spinlock 1 and the else branch is setting spinlock 2. So, whenever you test the synchronized version you are going to get a deadlock since your locking has no thread identity... a thread can block itself by checking the lock after setting it. -Paul Speed > } > 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