黑马程序员技术交流社区

标题: 关于同步代码块的问题 [打印本页]

作者: 李晓旭    时间: 2012-3-13 16:28
标题: 关于同步代码块的问题
class Demo  implements Runnable
{
        Object obj = new Object();
       
        public void run() {
                ......
                        synchronized(obj){
                        ......
                        }
                }
        }
}

class ThreadDemo{
         public static void main(String[] args){
                
                Demo d = new Demo();
                Thread t1 = new Thread(d);
                Thread t2 = new Thread(d);
                Thread t3 = new Thread(d);
                t1.start();
                t2.start();
                t3.start();
                               
        }
}
用实现Runnable接口的方法,在同步代码块内,创建一个Object类的锁,不是每个线程分别创建了自己的Object对象么,为什么能共用同一个锁?
作者: 赵孟恩    时间: 2012-3-13 21:21
class Demo  implements Runnable
{
         Object obj = new Object();
         
        public void run() {
                 ......
                         synchronized(obj){
                         ......
                         }
                 }
         }
}

class ThreadDemo{
          public static void main(String[] args){
                  
                Demo d = new Demo();   //  只创建了一个Demo对象  下面的线程都是调用你创建的d对象的run()方法  只有一个Object类的锁 ,要是分别创建那么多线程的锁
                                  // 就不是同一个锁了
                 Thread t1 = new Thread(d);  
                 Thread t2 = new Thread(d);
                 Thread t3 = new Thread(d);
                 t1.start();
                 t2.start();
                 t3.start();
                                 
        }
}

作者: 崔岩    时间: 2012-3-13 21:44
最好时刻用面向对象的思想来理解代码。比如说你现在要处理的业务对象是demo(举视频里的例子卖票),那就把demo独自封装起来,同时只生成一个demo对象,因为票是要各个卖票窗口共享一份数据的。而后在把demo对象作为参数,传给Thread的构造函数,这样,每个线程就好比卖票窗口,但是他们使用的都是一个票源的数据。
作者: 王杰    时间: 2012-3-13 22:03
哈哈 这个问题我刚解决。你其实就一个object所,因为你就只有一个Demo对象呀。
作者: 李晓旭    时间: 2012-3-13 22:10
哦,就是啊~~对象是传参进来的
作者: 袁野    时间: 2012-3-13 22:12
不论是什么锁只要是个对象就可以




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