请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

synchronized 修饰的类锁和对象锁的理解问题

本课学到第六章,回头看了下悟空老师synchronized的课程。学完类锁和对象锁,一直弄不太清楚期间的区别。

图片描述
针对如上代码提出以下几个疑问:
1:我一直认为:“线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁。”
按照我的理解,当线程Thread-0 执行时,只会进入if语句,执行method1()方法,else语句中的method2()方法不会上锁,因为没有被执行。反之执行else的方法 ,if的方法也不会上锁。可实际运行结果是Thread-0 是等待Thread-1 释放锁之后才执行的。(不考虑线程执行的顺序)附图:
图片描述
这结果颠覆了我对对象锁的认知。 我又开始理解为,对象锁关键点在对象,也就是对象内的代码不管是否会被执行,都会上锁,(也就是说锁作为了一种状态,一个实例里面可能有多个同时的锁)只有在代码运行时走完了所有的上锁的代码后,才会释放锁。所以test1实例对象的线程Thread-0 不管会不会执行method2 ,都会上锁。以上理解是否正确。
补充:(老师请看完所有问题后在回答,后文我的思路有变化!)

2.每个实例都有自己对应的一把锁,不同实例之间互不影响。这句话中的实例,是否是指“Test test1= new Test();”中Test 的实例 test1,也就是说 :“我用test1作为tatget 启动多个线程时,代码执行到method1()方法时,这多个线程共用一个锁,而test2实例启动的线程用的不是test1的锁而是另一把锁” 。这种理解是否正确。
补充:(老师请看完所有问题后在回答,后文我的思路有变化!)

3.原本根据我既有的理解我还想提出一些针对:“method2被static修饰变成类锁的时候,两个线程能同时进行。”的问题。
敲着文字的时候我的脑海里突然冒出了一个想法!推翻了问题1里**(也就是说锁作为了一种状态,一个实例里面可能有多个同时的锁)的理解。新的理解是:是不是锁是一种执行的动作,就像是我们手里拿着一把锁头,去锁住一个有插销的门。执行一段代码理解为我们走过一扇门!每个被synchronized修饰的方法理解为门上装的插销。当我们走过一个有插销的门的时候 我们把手里的锁头锁在上面,所以其他线程无法访问。锁只有一个,注意 是一个!
针对对象锁来说,多个实例对象共用一把锁,也就是 test1 和test2 两个人只有一把锁头,所以test1 拿着锁头 去执行了 method1()方法 也就是锁住了method1的门。test2 要等待test1释放锁,不是说等着test1把门打开,而是说test1执行完之后把锁头给他。 这么理解 和 问题1里面
“线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁。”**相吻合,也和问题2 相吻合。

同时老师提过,类锁和对象锁不是一回事儿,也就理解为,对象锁 ,不同实例对象用的不是一个对象锁。但是不管你是啥对象,所有对象都用一个类锁。并且类锁和对象锁 对应的方法门上的插销也是不一样的。彼此的锁头只能锁上对应的插销。
为了证实我3的想法,我写了以下代码,去掉了执行判断,并分析:图片描述
按照我的想法:
Thread-0 和Thread-1 是一个实例共用一个对象锁头,所以Thread-1需要等待Thread-0执行完方法一释放对象锁头,才能执行方法一。 Thread-2 是另一个实例 ,有自己的对象锁头,执行方法一。Thread-0执行完方法一释放对象锁头,执行方法二,锁上了类锁头。Thread-1拿到对象锁头执行方法一。 而 Thread-1 和Thread-2 只有等Thread-0执行完方法二释放类锁头后,才能拿到类锁头,然后依次执行方法二。(不考虑线程运行先后顺序)
运行结果

理解和运行结果看起来一致,就是不确定是否真的一致,希望老师给予解答。

正在回答

1回答

你最后的理解是对的哈,一个实例共用一个对象锁头。

1 回复 有任何疑惑可以回复我~
  • 提问者 慕沐8352146 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2020-05-13 15:27:35
  • 白篱 #2
    是因为在JVM分配对象内存的时候,将锁放在了对象头里面,所以new一个对象,实际上每个对象在对象头里面都有锁吗。
    回复 有任何疑惑可以回复我~ 2021-08-29 23:01:17
  • 悟空 回复 白篱 #3
    是对象头里有用于标记锁的地方哈
    回复 有任何疑惑可以回复我~ 2021-08-30 02:13:53
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信