码迷,mamicode.com
首页 > 编程语言 > 详细

多线程访问同步方法的7种情况(面试常考)

时间:2019-04-04 20:38:47      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:color   图片   没有   释放   访问   调用   影响   法线   对象   

1.

2.

3

4.同时访问同步方法和非同步方法

synchronized只作用于用它修饰的方法,没有加synchronized 的方法不会受到影响,

技术图片

技术图片

如图可以看出加了synchronized修饰符的方法和没有加的方法是同步执行的,也就是说互不影响

 

5.同时访问一个类的普通同步方法

对于同一个实例来说,他们拿到了同一把锁,没办法同时运行,而是串行

*虽然synchronized没有指明用那一把锁,但是其背后原理已经指明他们用了同一把锁,因为他们用了同一把锁*

技术图片

 

 技术图片

同一个实例

技术图片

 

6.同时访问静态synchronize方法和非静态synchronized方法

因为它们两个拿到了不同的锁,所以是并行执行的,

技术图片

技术图片

 

7.方法抛出异常后,会释放锁

方法抛出异常后,会释放锁,一旦抛出异常后,第二个线程会立刻进入同步方法,意味着锁已经释放

 

个人认为还有一种:同时访问多个静态synchronize方法

这种形式他们拿到的只是同一把锁,所以不能并行执行,所以要按照顺序一个线程执行完再到另外一个线程

技术图片

技术图片

 

 

          总结

1.一把锁只能同时被一个线程获取,没有拿到锁的必须等待

2,每个实例都有自己对应的一把锁,不同实例之间互不影响,例外:(锁对象是*.class以及synchronized修饰的是static方法的时候,所有对象共同拥有一把锁)

3.无论是方法正常执行完毕或者是方法抛出异常,都会释放锁,

4,在一个被synchronized修饰的方法里面调用了一个没有被synchronized修饰的方法线程安全吗?

  答案是不安全,因为synchronized只对修饰本生的方法起作用,对其他方法不起作用。

多线程访问同步方法的7种情况(面试常考)

标签:color   图片   没有   释放   访问   调用   影响   法线   对象   

原文地址:https://www.cnblogs.com/steakliu/p/10656739.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!