黑马程序员技术交流社区

标题: 毕老师视频多线程里面说到synchronized(obj)疑惑 [打印本页]

作者: 陨落″烟雨。    时间: 2014-2-18 10:30
标题: 毕老师视频多线程里面说到synchronized(obj)疑惑
       这里就是所谓的同步锁,防止多线程对一个数据的同时操作,但是我怎么就理解不了这个“上帝锁”,括号里面是随便放个对象就可以?
作者: 榨菜    时间: 2014-2-18 11:07
恭喜你答对了,里面可以是随便一个对象。  但是这个对象在各个synchronized里面要相同,这样才能同步
作者: 榨菜    时间: 2014-2-18 11:08
Object是所有类的父类,所以叫上帝
作者: lei    时间: 2014-2-18 11:39
首先,synchronized()就是对象锁,或者是线程锁。它的作用就是任一线程使用这个方法后,只有当这个线程使用完毕之后,其它线程才能进入使用。
你提到的上帝锁,就是指synchronized()中指定了obj。obj是object的缩写,而object 是java类中的基类,所有类都可以继承object,当你设置形参为object时,其他所有类型都可以传入,因此我们可以用synchronized(obj)来控制所有的线程,因此称之为上帝锁!
作者: 松涛小玮    时间: 2014-2-18 11:39
可以理解为上帝就是所有的锁,具体有铁门锁,铜门锁,绳门锁,等各式各样的锁,synchronized中的代码相当于用铁门锁锁住了 ,铜的就开不了,想要开,即要用同样的锁
作者: 菠萝鱼    时间: 2014-2-18 13:42
synchronized(obj)。  synchronized()就像一扇门,obj就是开门的钥匙,钥匙只有一个,钥匙可以是任意对象,如果你想开这扇门,你就拿到这个门的钥匙,其他人想要打开这个门,也需要钥匙,钥匙是在你的手中,所以其他人就得等着。如果钥匙有多个,其他人也可以打开这个门。
作者: 廉伟杰    时间: 2014-2-18 13:45
首先这个并不是随便放歌对象就可以了的,必须放一个没变的对象并且情况不一样
synchronized修饰方法:
1.非静态方法:  默认的同步监听器对象  this
2.静态方法:  默认的同步监听器对象 是该方法所在类的 Class对象   ooxx.class

若线程是实现方式:
:同步代码块: 同步监听对象可以选 this, 这个方法所在类的Class对象, 选一个不变对象
:同步方法:   此时可以使用synchronized直接修饰 run方法,因为同步监听器 是 this;

若线程时继承方式:
:同步代码块: 这个方法所在类的Class对象, 选一个不变对象
:同步方法:     此时不能使用synchronized直接修饰 run方法

作者: 陨落″烟雨。    时间: 2014-2-18 14:27
榨菜 发表于 2014-2-18 11:07
恭喜你答对了,里面可以是随便一个对象。  但是这个对象在各个synchronized里面要相同,这样才能同步 ...

谢谢您的回答!
作者: 陨落″烟雨。    时间: 2014-2-18 14:31
lei 发表于 2014-2-18 11:39
首先,synchronized()就是对象锁,或者是线程锁。它的作用就是任一线程使用这个方法后,只有当这个线程使用 ...

其实上锁的对象就是要与之相关的对象,谢谢您的回答,有用!
作者: 陨落″烟雨。    时间: 2014-2-18 17:01
廉伟杰 发表于 2014-2-18 13:45
首先这个并不是随便放歌对象就可以了的,必须放一个没变的对象并且情况不一样
synchronized修饰方法:
1.非 ...

谢谢回答!




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