我晕的地方就是:如果有两个线程要调用某个方法,而这个方法已经被synchronized而且这个方法中有sleep方法 那么在它sleep以后,当前访问这个方法的线程是不是就让给另一个线程访问,然后直到这个线程访问结束再开始往下执行。。
比方说这个程序:public class Que_Sync extends Thread{
public static void main(String[] args){
Que_Sync q1 = new Que_Sync();
Que_Sync q2 = new Que_Sync();
q1.start();
q2.start();

}

public static void m1(String name){
for(int i=0;i<10;i++){
System.out.println(name+" "+i);
try{
Thread.sleep(1);
} catch(InterruptedException e){}
}
}

public void run(){
m1(Thread.currentThread().getName());
}
}
这个程序的输出结果就是两个线程交替着输出。。如果我按照以上程序对sleep方法与synchronized之间的关系做出的本帖开始的理解没有错的话,我就无法理解以下程序呢:
public class TestSync implements Runnable {
Timer t = new Timer();
public static void main(String[] args){
TestSync ts = new TestSync();
Thread tr1 = new Thread(ts);
Thread tr2 = new Thread(ts);
tr1.setName("tr1");
tr2.setName("tr2");
tr1.start();
tr2.start();
}
public void run(){
t.add(Thread.currentThread().getName());
}
}class Timer{
public static int num = 0;
public synchronized void add(String name){

num++;
try{
Thread.sleep(1000);
} catch(InterruptedException e){}
System.out.println(name+"是第"+num+"个访问此方法的线程");

}
}
按照开始我对sleep和synchronized之间关系的理解,那么这个程序应该都显示是第2个访问此线程的方法,因为当第一个线程访问add方法以后num++变为1然后sleep然后第二个线程访问此方法num++,这时num就已经变为2呢。。那么两个线程在按照顺序往下输出应该都是2啊。为什么实际的输出是一个1,一个2呢?我被线程给弄的有点晕呢。。好心的大大给解释解释

解决方案 »

  1.   

    Sleep后, 方法也要继续走完啊
      

  2.   

    我觉的应该是这么理解的,你的第二个程序在方法add()上加了 synchronized.你可以把它想象成一把锁,当一个线程调用这个方法时他就拥有了这把锁。直到执行完方法中的内容才释放自己的锁。也有可能遇到其他事件中间就释放锁。但你调用sleep()方法却不会释放自己的锁,所以第一个线程正常结束结果是1,因为是static变量所以第二个执行完是2。  不知道这么解释怎么样你能看懂不 呵呵
      

  3.   

    在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权。 这是java 帮助文档里对sleep()方法的解释,他说的不丢失监视器的所属权,就是我说的锁
      

  4.   

    第一个线程进入add方法,休眠1秒后打印1,接着第二个线程进入add方法,休眠1秒后打印2.
      

  5.   

    调用sleep()时线程并不释放锁,如果你想得到想要的结果试试调用wait()方法
      

  6.   

    因为第一个线程在Thread.sleep(1000)时,并没有将synchronized这个锁释放,等1秒后,这个线程执行完System.out.println(name + "是第" + num + "个访问此方法的线程");这句后,退出add方法,才将锁给了第二个线程,所以执行的时候,第一个线程就是1,第二个线程就是2
      

  7.   

    那我的第一个程序怎么解释呢,如果sleep方法不会让线程释放锁,那么第一个程序的结果不应该是 交替 着输出呀。。还是有点迷糊