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

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

1.

2.

3

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


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




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


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


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


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




同一个实例



如果不是同一个实例,则普通同步方法各自会获得一把锁,能够并发执行




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


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




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


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


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


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




 总结


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


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


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


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


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

目录
相关文章
|
11天前
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
|
11天前
|
SQL 安全 测试技术
[go 面试] 接口测试的方法与技巧
[go 面试] 接口测试的方法与技巧
|
11天前
|
存储 安全 Go
Go 面试题:string 是线程安全的吗?
Go 面试题:string 是线程安全的吗?
|
13天前
|
机器学习/深度学习 算法 Python
【机器学习】面试问答:决策树如何进行剪枝?剪枝的方法有哪些?
文章讨论了决策树的剪枝技术,包括预剪枝和后剪枝的概念、方法以及各自的优缺点。
27 2
|
13天前
|
机器学习/深度学习
【机器学习】面试题:LSTM长短期记忆网络的理解?LSTM是怎么解决梯度消失的问题的?还有哪些其它的解决梯度消失或梯度爆炸的方法?
长短时记忆网络(LSTM)的基本概念、解决梯度消失问题的机制,以及介绍了包括梯度裁剪、改变激活函数、残差结构和Batch Normalization在内的其他方法来解决梯度消失或梯度爆炸问题。
27 2
|
13天前
|
存储 机器学习/深度学习 缓存
【数据挖掘】XGBoost面试题:与GBDT的区别?为什么使用泰勒二阶展开?为什么可以并行训练?为什么快?防止过拟合的方法?如何处理缺失值?
XGBoost与GBDT的区别、XGBoost使用泰勒二阶展开的原因、并行训练的原理、速度优势、防止过拟合的策略以及处理缺失值的方法,突出了XGBoost在提升模型性能和训练效率方面的一系列优化。
17 1
|
13天前
|
机器学习/深度学习
|
4天前
|
Dart API C语言
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
|
4天前
|
Java UED
基于SpringBoot自定义线程池实现多线程执行方法,以及多线程之间的协调和同步
这篇文章介绍了在SpringBoot项目中如何自定义线程池来实现多线程执行方法,并探讨了多线程之间的协调和同步问题,提供了相关的示例代码。
25 0