使用synchronized同步代码块为什么要定义Object对象

使用synchronized同步代码块为什么要定义Object对象

问题描述:

同题目,老师在使用synchronized同步代码块时,自定义了一个Object对象作为锁。

Object lock = new Object();
synchronized (lock) {
     ......
}


但是在讲到同步方法时,老师说this就可以直接作为锁使用,我在同步代码块使用相同的逻辑程序也可以正常运行。

synchronized (this) {
     ......
}


请问老师如果可以直接使用this当锁,自定义Object对象作为锁有什么优势吗?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,1、synchronized()小括号里是要被锁定的对象,要锁定哪个对象,就将那个对象写在括号中。synchronized(this)是指锁定当前对象,而synchronized (lock)是指lock对象。

2、线程同步我们可以这样理解,我们在超市中存包时,当一个柜子中存入东西时,就会把这儿柜门锁上,给出小纸条作为钥匙,此时其他人去开这个柜门,就不能打开,而当我们买完东西,使用小纸条打开柜门,取出东西后,这个柜子的锁就释放了!那这时别人再来打开这个柜子,就可以打开了!

    具体使用this还是其他对象都是可以的,具体是看那个对象是那个小纸条,如果代码中使用的synchronized(this),则当前对象(this)就相当于这个小纸条。只有当前的用户才可以进行操作,从而实现的同步。

祝学习愉快!

  • Macrohard 提问者 #1

    老师解释的我可以懂,但还是没有明白使用Object对象的好处,因为课程中说要实现代码的逻辑,就必须所有线程使用共享的类(持有锁和同步代码),也就是说当线程执行时,当前线程一定持有锁,也就是一定在使用这个共享类,所以我感觉使用Object对象和this的逻辑是一样的吧。

    2023-07-28 11:44:55
  • 好帮手慕小尤 回复 提问者 Macrohard #2

    同学你好,是的,实现的逻辑是一样的。具体的区别就是在于synchronized(this)是使用当前对象作为锁,而synchronized(lock)是使用一个新创建的Object对象作为锁。

        synchronized(this)是隐式的加锁,锁住的是当前对象。而synchronized(lock)是显式的加锁,需要手动创建一个对象作为锁,并在代码块中使用该对象进行加锁。

    祝学习愉快!

    2023-07-28 13:21:27
  • Macrohard 提问者 回复 好帮手慕小尤 #3

    好的,谢谢老师。

    2023-07-28 13:24:32
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java工程师 2024版
  • 参与学习       2020    人
  • 提交作业       1249    份
  • 解答问题       1202    个

2024重磅革新,超百小时内容豪华升级,加速提升高级技能与高薪就业竞争力 课程紧贴企业最新人才需求,历经7年持续迭代,帮助万名学子入行转行 从零起点到高阶实战,学习路径稳健顺滑,成就从小白到工程师高薪

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师