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

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

clipboard.png

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

阅读 2.8k
2 个回答

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

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

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题