吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 893|回复: 8
收起左侧

[求助] synchronized 关键字,学习问题求助

[复制链接]
我酒桶你纳尔 发表于 2021-11-25 09:55
学习线程的时候对synchronized参数用法不理解,网上找找资料 微信图片_20211125094436.png

问题:为什么同步代码块中的内容已经执行完了,却没有释放锁呢?
会不会是释放的时候,同一个线程又获取到锁了?

文章中给的原因是:sleep时候不会释放锁,其他线程也无法进行操作。
我对这里有点疑惑,sleep是线程等待,不管有没有等待,代码块结束后不就是应该释放锁么?

文章地址:https://blog.csdn.net/a1064072510/article/details/84065646

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hknius 发表于 2021-11-25 10:11
Thread.sleep()是当前线程等待,也算在你的代码块中
 楼主| 我酒桶你纳尔 发表于 2021-11-25 10:20
VioletKiss 发表于 2021-11-25 10:22
这就相当于你把门上锁了,然后拿了钥匙在门外等了5秒钟再开锁,在这5秒中里,别人没有钥匙也开不了锁
 楼主| 我酒桶你纳尔 发表于 2021-11-25 10:26
VioletKiss 发表于 2021-11-25 10:22
这就相当于你把门上锁了,然后拿了钥匙在门外等了5秒钟再开锁,在这5秒中里,别人没有钥匙也开不了锁

学习了,谢谢
 楼主| 我酒桶你纳尔 发表于 2021-11-25 10:27
Hknius 发表于 2021-11-25 10:11
Thread.sleep()是当前线程等待,也算在你的代码块中

学习了,谢谢
 楼主| 我酒桶你纳尔 发表于 2021-11-25 11:18
代码执行猜想:
1、首个线程A获取锁,执行代码
2、A线程等待了0.005秒
3、因为线程等待了,对A线程来讲,锁还在他手里,A还可以继续执行
4、A执行第二遍,然后再等待,进入循环,从15-0都应该是A线程再执行

但我把线程等待提高到1秒,数字换成150。
A线程等待1秒的过程中,并未释放锁,其他线程应该是不可以参与竞争的,应该由持锁的A继续执行,但我测试的时候发现,线程切换了,是为什么呢?
4.png
helloworld2022 发表于 2021-11-25 12:30
我酒桶你纳尔 发表于 2021-11-25 11:18
代码执行猜想:
1、首个线程A获取锁,执行代码
2、A线程等待了0.005秒

大佬,学习了。
VioletKiss 发表于 2021-11-25 13:48
本帖最后由 VioletKiss 于 2021-11-25 13:52 编辑
我酒桶你纳尔 发表于 2021-11-25 11:18
代码执行猜想:
1、首个线程A获取锁,执行代码
2、A线程等待了0.005秒

当你打印出那行字后就代表释放锁了
因为你的线程A执行结束了释放了锁,这时候所有线程就会参与竞争,线程E竞争过了自然就切换了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 18:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表