A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李晓旭 中级黑马   /  2012-3-13 16:28  /  1463 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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对象么,为什么能共用同一个锁?

5 个回复

倒序浏览
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();
                                 
        }
}
回复 使用道具 举报
最好时刻用面向对象的思想来理解代码。比如说你现在要处理的业务对象是demo(举视频里的例子卖票),那就把demo独自封装起来,同时只生成一个demo对象,因为票是要各个卖票窗口共享一份数据的。而后在把demo对象作为参数,传给Thread的构造函数,这样,每个线程就好比卖票窗口,但是他们使用的都是一个票源的数据。
回复 使用道具 举报
哈哈 这个问题我刚解决。你其实就一个object所,因为你就只有一个Demo对象呀。
回复 使用道具 举报
哦,就是啊~~对象是传参进来的
回复 使用道具 举报
不论是什么锁只要是个对象就可以
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马