线程A执行某对象的synchronized方法时,其他线程是否可以执行该对象的其他非synchronized方法
如下图,线程A执行obj的synchronized方法的同时,线程B是否可以去执行obj的其他非synchronized的方法
网上看过几篇博客,大都说可以。但是按我的理解,当线程A持有obj的锁时,线程B想要访问obj,必须阻塞直到获得对象锁才行吧?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
自问自答吧!
线程B当然可以去执行其他非synchronized的方法,因为并没有synchronized,所以该线程并不会请求得到对象锁才继续执行。
以下是个人猜想,如有错误还请指正!
方法没有标记
synchronized
时,表示 [调用此方法时不需要获取对象的锁],换言之,此调用与正常调用一样,JVM 并不会做什么特殊处理。如果标记了
synchronized
,表示编写者认为该方法有可能造成资源冲突,因此要求此方法被调用时尝试获取对象的锁并一直等待直到获取成功。毕竟如果一个对象的方法,并不会对内部的字段属性或是外部资源产生竞争时,它是不是多线程环境调用都是无关紧要的,因此 JVM 把决定某个方法是否需要用锁来保护的选择权力交给你。
要知道,在 Java 中,方法是单独的对象
Method
,因此一个方法被锁保护了,并不意味着它所属的类的某个对象实例被保护,除非你显式得使用synchronized
块去锁住对象。