为了账号安全,请及时绑定邮箱和手机立即绑定

synchronized修饰方法时的误解

标签:
Java

以前一直没注意synchronized关键字在修饰方法时候的问题,今天偶然看HashTable的时候突然觉得自己有个误区,不知道各位大神是否有在意。
个人一直以为synchronized修饰方法是锁的是方法,一个对象的方法同一时刻只能有一个线程获取到锁,而想当然的认为一个对象其他synchronized方法之间是不互斥的。
例如:

 public synchronized V get(Object key) {
        ...
 } public synchronized V put(K key, V value) {
       ...
 }

如上述两个方法,调用get()时put()方法是否会阻塞呢,我以前的想当然的以为两者之间是无关的,事实上两个方法是互斥的,为什么呢?
这里需要理解synchronized到底锁了什么?
synchronized锁了什么,synchronized在指明锁对象的时候很好理解,如:

void foo(){     synchronized(obj){
          ...
    }
}

上述实例中,synchronized锁的是obj对象。然而在没有指明对象的时候呢?

void foo(){     synchronized {
          ...
    }
}

上述同步代码块这个锁的就是运行时this对象。
然而到方法级修饰的时候,我就一下踩坑里去了:

synchronized void foo1(){
          ...
}synchronized void foo2(){
          ...
}

这里我直接认为它是一个同步方法,并没有想它锁的是谁,没有锁对象就没有同步之谈。上述方法其实还是隐晦的锁了this对象,所以一个对象的同步方法之间是完全互斥的,foo1方法被锁,会阻塞foo2方法。
此外,扩展到static静态方法,static静态方法则是锁住了类的class对象。

Mark一下平时没有注意的地方


作者:徐志毅
链接:https://www.jianshu.com/p/eb7b5cb06b82

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消