如下图,线程A执行obj的synchronized方法的同时,线程B是否可以去执行obj的其他非synchronized的方法
网上看过几篇博客,大都说可以。但是按我的理解,当线程A持有obj的锁时,线程B想要访问obj,必须阻塞直到获得对象锁才行吧?
如下图,线程A执行obj的synchronized方法的同时,线程B是否可以去执行obj的其他非synchronized的方法
网上看过几篇博客,大都说可以。但是按我的理解,当线程A持有obj的锁时,线程B想要访问obj,必须阻塞直到获得对象锁才行吧?
以下是个人猜想,如有错误还请指正!
方法没有标记 synchronized
时,表示 [调用此方法时不需要获取对象的锁],换言之,此调用与正常调用一样,JVM 并不会做什么特殊处理。
如果标记了 synchronized
,表示编写者认为该方法有可能造成资源冲突,因此要求此方法被调用时尝试获取对象的锁并一直等待直到获取成功。
毕竟如果一个对象的方法,并不会对内部的字段属性或是外部资源产生竞争时,它是不是多线程环境调用都是无关紧要的,因此 JVM 把决定某个方法是否需要用锁来保护的选择权力交给你。
要知道,在 Java 中,方法是单独的对象 Method
,因此一个方法被锁保护了,并不意味着它所属的类的某个对象实例被保护,除非你显式得使用 synchronized
块去锁住对象。
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
自问自答吧!
线程B当然可以去执行其他非synchronized的方法,因为并没有synchronized,所以该线程并不会请求得到对象锁才继续执行。