我晕的地方就是:如果有两个线程要调用某个方法,而这个方法已经被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呢?我被线程给弄的有点晕呢。。好心的大大给解释解释
比方说这个程序: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呢?我被线程给弄的有点晕呢。。好心的大大给解释解释
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货