synchronized修饰方法时的误解

以前一直没注意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一下平时没有注意的地方
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 封装 概念:把同一类事物的共性(属性和方法)归到一个类中,隐藏实现细节,对外提供公共的访问接口。优点:复用性好、安...
    iDaniel阅读 2,732评论 0 0
  • 导语 母亲就是这一个看上去年华渐逝的妇人,将她的一生一世,毫无怨言,更不求任何回报地交给了父亲和我们这些孩子。真正...
    漫游家阅读 4,172评论 0 0
  • 今天早晨去送女儿上学时,雪花就开始飘起来了,女儿说,妈妈下午的亲子活动你可一定要早点来啊,我说你放心吧,妈...
    梁佳硕妈妈阅读 1,567评论 0 1
  • 想做兼职,不容易,如果找不到好的兼职,合适的兼职,往往是花费了大量时间,却没有赚钱一分钱。 上班族每个月都是拿着固...
    覃若思阅读 8,794评论 0 2
  • 补充胶原蛋白:肌肤的软黄金 胶原蛋白被称为肌肤的软黄金,占皮肤比重达到70%-80%。 它是刚性蛋白质,质地坚韧如...
    Togi何阅读 2,854评论 0 0

友情链接更多精彩内容