黑马程序员技术交流社区

标题: 一个关于同步的问题 [打印本页]

作者: 黄一—一    时间: 2012-7-11 17:23
标题: 一个关于同步的问题
本帖最后由 黄一—一 于 2012-7-11 17:47 编辑

代码如下,为什么执行的结果只有syn1在执行,并且是单线程,求高手解答。

public class test4 {
        public static void main(String [] args){
                syn1 ss1=new syn1();
                syn2 ss2=new syn2();
                new Thread(ss1).start();
                        new Thread(ss1).start();
                new Thread(ss2).start();
        }
}


class  syn1 implements Runnable{
        public String str1="";
        public void run() {
                synchronized(str1){
                        while(true){
                                try{Thread.sleep(1);}catch(Exception e){}
                                System.out.println("syn1:"+Thread.currentThread().getName());
                        }
                }
        }        
}

class  syn2 implements Runnable{
        public String str2="";
        public void run() {
                synchronized(str2){
                        while(true){
                                try{Thread.sleep(1);}catch(Exception e){}
                                System.out.println("syn2:"+Thread.currentThread().getName());
                        }
                }
        }
}
作者: 王双宝    时间: 2012-7-11 17:34
public class Test {

         public static void main(String [] args){
         syn1 ss1=new syn1();
         syn2 ss2=new syn2();
         new Thread(ss1).start();
                 new Thread(ss1).start();
         new Thread(ss2).start();
}

}
class  syn1 implements Runnable{
    public String str1=new String("");//改成new String("");
    public void run() {
            synchronized(str1){
                    while(true){
                            try{Thread.sleep(1);}catch(Exception e){}
                            System.out.println("syn1:"+Thread.currentThread().getName());
                    }
            }
    }        
}
class  syn2 implements Runnable{
    public String str2=new String("");////改成new String("");
    public void run() {
            synchronized(str2){
                    while(true){
                            try{Thread.sleep(1);}catch(Exception e){}
                            System.out.println("syn2:"+Thread.currentThread().getName());
                    }
            }
    }
}
str1与str2其实是同一个对象,在第一个线程运行时,对该对象上了锁,因此每二个线程阻塞等待。这样写str1=new String("")和str2=new String("")就可以了.
作者: 黑马刘涛    时间: 2012-7-11 17:47
学习。谢谢楼上热心解答。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2