线程A执行某对象的synchronized方法时,其他线程是否可以执行该对象的其他非synchronized方法

发布于 2022-09-07 20:13:00 字数 232 浏览 20 评论 0

如下图,线程A执行obj的synchronized方法的同时,线程B是否可以去执行obj的其他非synchronized的方法

clipboard.png

网上看过几篇博客,大都说可以。但是按我的理解,当线程A持有obj的锁时,线程B想要访问obj,必须阻塞直到获得对象锁才行吧?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

拥抱影子 2022-09-14 20:13:00

自问自答吧!
线程B当然可以去执行其他非synchronized的方法,因为并没有synchronized,所以该线程并不会请求得到对象锁才继续执行。

魂ガ小子 2022-09-14 20:13:00

以下是个人猜想,如有错误还请指正!

方法没有标记 synchronized 时,表示 [调用此方法时不需要获取对象的锁],换言之,此调用与正常调用一样,JVM 并不会做什么特殊处理。

如果标记了 synchronized ,表示编写者认为该方法有可能造成资源冲突,因此要求此方法被调用时尝试获取对象的锁并一直等待直到获取成功。

毕竟如果一个对象的方法,并不会对内部的字段属性或是外部资源产生竞争时,它是不是多线程环境调用都是无关紧要的,因此 JVM 把决定某个方法是否需要用锁来保护的选择权力交给你。

要知道,在 Java 中,方法是单独的对象 Method,因此一个方法被锁保护了,并不意味着它所属的类的某个对象实例被保护,除非你显式得使用 synchronized 块去锁住对象。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文