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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

private  int tick = 100;
        Object obj = new Object();
        public void run()
        {
                while(true)
                {
                        synchronized(obj)
                        {
                                if(tick>0)
                                        System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
                                }
                        }
                }
上锁,开锁  0、1间的转换是如何与这个obj对象关联的?

7 个回复

倒序浏览
任何对象都可当做锁对象,必须保证所有线程所使用的锁对象时同一个对象,这样才会同步。
回复 使用道具 举报 1 0
表示锁住的是obj这个对象,而不是当前类的对象呀。

因为默认是锁当前对象的。

如果锁住的是obj这个对象,那么其他需要obj这个对象锁来执行的代码段是需要等待这个执行完了之后再执行的,但是这个obj不是当前对象this,那么这个类的当前对象就可以执行其他方法不用等待。

如果synchronized(this){}表示就是锁住当前对象,这个类的其他同步方法就需要等待这个代码段执行完了才能执行。

其实就是互斥条件嘛,临界资源。
回复 使用道具 举报 1 0
mrwise1991 发表于 2014-1-15 20:30
表示锁住的是obj这个对象,而不是当前类的对象呀。

因为默认是锁当前对象的。

不大懂 视频里说随便创建一个 就行 就是想在多线程的时候锁住这一部分代码就行 谢谢 你理解的比我透彻
回复 使用道具 举报
实现Runnable接口的这类中维护了一个Object对象,毕老师这么写是为将这个Object对象作为锁的确认标记。不管是哪个线程运行,这个Object对象都没有改变,只有一份,所有任何线程锁的确认标记都是这个Object,这样就确保了数据同步。使用synchronized关键字的前提是将传入这个锁中对象是唯一 一份就可以了,你也可以将obj改成类名.class,得到是时这个类的Class对象,也是唯一一份的。毕老师说的0和1是为了方便我们理解,将他比如成开锁和关锁。任何线程具有执行权后,就持有锁,别的线程就没有执行权,就是这个道理。
回复 使用道具 举报
还不到时候 发表于 2014-1-15 22:38
实现Runnable接口的这类中维护了一个Object对象,毕老师这么写是为将这个Object对象作为锁的确认标记。不管 ...

谢谢 有用
回复 使用道具 举报
确保是唯一的就行!
回复 使用道具 举报

synchronized(同步监听对象) {
//需要同步的代码
}
同步监听对象取值通常有:
1. 同一份资源;
2. this,此时只能使用实现方式(实现Runnable接口),继承(Thread)时不能使用this
3. 同步代码块所在类的字节码,
synchronized同步方法时:

非静态方法默认使用的是this作为同步监听对象;
静态方法默认是使用的是方法所在类的字节码对象;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马