黑马程序员技术交流社区

标题: syschronized监视器对象 [打印本页]

作者: 左华清    时间: 2012-2-22 17:25
标题: syschronized监视器对象
本帖最后由 左华清 于 2012-2-23 11:38 编辑

public class ThreadDemo1 {
        public static void main(String[]args){
                TestThread tt=new TestThread();
                new Thread(tt).start();
                tt.str=new String("method");
                new Thread(tt).start();
        }
}
class TestThread implements Runnable{
        int tickets=100;
        String str=new String("");
        public void run(){
                if(str.equals("method")){
                        while(true){
                                sail();
                        }
                }else{
                        while(true){
                                synchronized(str){
                                        if(tickets>0){
                                                try{Thread.sleep(1);}catch(Exception e){};
                                                System.out.println("run():"+Thread.currentThread().getName()+"-----is sailing ticket"+tickets--);
                                        }
                                }
                        }
                }
               
        }
       
        public synchronized void sail(){
                if(tickets>0){
                        try{Thread.sleep(1);}catch(Exception e){};
                        System.out.println("sail():"+Thread.currentThread().getName()+"----is sailing ticket"+tickets--);
                }
        }
}

请大家帮忙指点下,为什么打印结果静是sail().........................
作者: 马胜平    时间: 2012-2-22 17:47
两个线程共享的是一个对象,两个线程里面的str都是method
作者: 沈样    时间: 2012-2-22 23:51
我觉得程序运行是这样的先是运行else中的代码,碰到了sleep,就执行tt.str=new String("method");,Str的值就变成了method,线程o再判断是否是method就一直执行 sail();
,也不太说得清楚,有正确答案请告之让大家一起学习一下呵呵
作者: 【专】【属】    时间: 2012-2-23 08:22
个人感觉第一个 new Thread(tt).start();是线程并没有马上去运行run中的内容,而在主线程tt.str=new String("method");后去执行的线程,
你可以在对str修改之前,让主线程去sleep一下,看一下结果

作者: 左华清    时间: 2012-2-23 11:37
谢谢各位,看了几遍视频了。原因正如大家所说的一样,执行的都是函数,不是同步代码块,
同步代码块和同步函数的监视器对象不同, 把synchronized(str)换成syschronized(this)就好了。

线程.start()之后,并不会立即启动执行,只是进入一个准备状态。
接着运行了 tt.str=new String("method");





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