my program is:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class test implements Runnable{
private static int i;
private static volatile Integer vi = 0;
private static AtomicInteger ai = new AtomicInteger();
private static Integer si = 0;
private static int ri;
private static AtomicInteger flag = new AtomicInteger();
private Lock lock = new ReentrantLock();
@Override
public void run() {
for(int k=0;k<200000;k++){
i++;
vi++;
ai.incrementAndGet();
synchronized (si){
si++;
}
lock.lock();
try{
ri++;
}finally {
lock.unlock();
}
}
flag.incrementAndGet();
}
public static void main(String[] args) throws InterruptedException{
test t1 = new test();
test t2 = new test();
ExecutorService exec1 = Executors.newCachedThreadPool();
ExecutorService exec2 = Executors.newCachedThreadPool();
exec1.execute(t1);
exec1.execute(t2);
while(true){
if(flag.intValue()==2){
System.out.println("i>>>>>>"+i);
System.out.println("vi>>>>>>"+vi);
System.out.println("ai>>>>>>"+ai);
System.out.println("si>>>>>>"+si);
System.out.println("ri>>>>>>"+ri);
break;
}
Thread.sleep(50);
}
}
}
the result is:
vi>>>>>>340217
ai>>>>>>400000
si>>>>>>364359
ri>>>>>>397043
could someone help to explain how does this multithread programs works? the result shows that vi is not equal to 400000 which is quite reasonable. but why si and ri is not equal to 400000? si is sychronized and ri is sychronized by locks.