关于线程同步,问题2

关于线程同步,问题2

http://img1.sycdn.imooc.com//climg/5a645d5600017cc004440390.jpg

http://img1.sycdn.imooc.com//climg/5a645d5700013c1a05410483.jpg

http://img1.sycdn.imooc.com//climg/5a645d5700011e2605420450.jpg

尝试给对象上同步锁,图2(在测试类中的主线程给d上同步锁)不成功,方法会被打断。在图3中(在实现接口的类中给d上同步锁)成功,方法不会被打断。所以对对象同步可不可以理解为在“本线程”运行“被同步的代码块并访问对象(d)的时候”的时候,对象(d)不能再被其他线程访问?“本线程访问对象(d)”是一个必要条件么?在主线程中加锁没有成功的原因是主线程没有访问d,可以这么理解么???

正在回答 回答被采纳积分+1

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

1回答
好帮手慕珊 2018-01-22 11:52:39

所以对对象同步可不可以理解为在“本线程”运行“被同步的代码块并访问对象(d)的时候”的时候,对象(d)不能再被其他线程访问?  这个可以这么理解。只要写了synchronized就表示对一个对象加锁了,如果什么都不写,默认就是当前对象this进行加锁,所以可以理解成一个必要条件。

主线程的同步块,两个线程都写到同步块里了,那么只要同步块的代码都执行完再去执行其他代码就可以了。而两个线程执行时,肯定有互相干扰的问题。所以两个线程同时写到同步块里,就不太合适了。

祝学习愉快!

  • 提问者 大佬金 #1
    所以同步代码块的作用是保证运行代码块内的语句的时候不会被打断么?但是我在eclipse中运行的时候发现被synchronized修饰的方法是有可能被打断的,也就是我在这一章节提出的另一个问题。。。所以我才写这一段代码来试synchronized的作用,后来发现synchronized的作用可能并不是保证被修饰的代码不会被打断。经过多次测试,我的理解是synchronized是修饰一段代码或方法【用大括号扩】,并锁定一个对象【用小括号扩】的一种机制。当被修饰的代码或方法被一个线程【t1】运行的时候,synchronized会保证被锁住的对象仅能被一个线程访问,而这个线程并不一定是t1,也可以是其他线程。当没有给出要锁定的具体对象的时候【例如修饰方法】默认锁定this【当前对象】,【这也就解释了主方法中为什么没有锁定成功,主方法中虽然锁了对象,但是仅能保证对象被一个线程访问,主方法并没有访问这个对象,当然不能阻止其他线程访问】而且当synchronized锁定对象的时候要分两种情况:1、synchronized关键字和它修饰的代码或方法在synchronized锁定的对象的类的内部的时候【也就是小括号内是this的时候】:这种时候synchronized锁定的并不是对象中的全部内容,而是锁定对象中被synchronized修饰的部分,对象中没有被修饰的部分是不会被锁定的。【锁定就是指被锁定的部分只能被一个线程访问】2、synchronized关键字和它修饰的代码或方法在synchronized锁定的对象的类的外部的时候【例如在线程类中的时候,锁定的对象不是线程类】:这种时候锁定的是该对象的全部内容。【这样就解释了我的另一个问题】 我的理解很繁琐,但是目前能解释验证时遇到的两个问题。。。请老师帮忙看一下有什么问题,陷在这里很久了。。。
    2018-01-22 22:56:38
  • 好帮手慕珊 回复 提问者 大佬金 #2
    同步方法有可能被打断要看具体的场景,所以可以贴出来具体的代码我们分析一下
    2018-01-23 14:04:55
  • 提问者 大佬金 #3
    关于打断的代码贴在线程同步里面提出的新问题里面了
    2018-01-23 14:15:48
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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