【多线程】线程同步 synchronized
2024-09-07 13:44:12
由于同一进程的多个线程共享同一块存储空间 , 在带来方便的同时,也带来了访问 冲突问题 , 为了保证数据在方法中被访问时的正确性 , 在访问时加入 锁机制synchronized , 当一个线程获得对象的排它锁 , 独占资源 , 其他线程必须等待 , 使用后释放锁即可 . 存在以下问题 :
- 一个线程持有锁会导致其他所有需要此锁的线程挂起 ;
- 在多线程竞争下 , 加锁 , 释放锁会导致比较多的上下文切换 和 调度延时,引 起性能问题 ;
- 如果一个优先级高的线程等待一个优先级低的线程释放锁 会导致优先级倒 置 , 引起性能问题 。
同步方法
由于我们可以通过 private 关键字来保证数据对象只能被方法访问 , 所以我们只需 要针对方法提出一套机制 , 这套机制就是 synchronized 关键字 , 它包括两种用法 synchronize方法和synchronized 块 。
//同步方法
public synchronized void method(int args){}
synchronized方法控制对 “对象” 的访问 , 每个对象对应一把锁 , 每个 synchronized方法都必须获得调用该方法的对象的锁才能执行 , 否则线程会阻塞 , 方法一旦执行 , 就独占该锁 , 直到该方法返回才释放锁 , 后面被阻塞的线程才能获 得这个锁 , 继续执行。
若将一个大的方法申明为synchronized 将会影响效率。
方法里面需要修改的内容才需要锁, 锁的太多 ,浪费资源。
同步块
//同步块
synchronized (Obj){}
Obj 称之为 同步监视器
Obj 可以是任何对象 , 但是推荐使用共享资源作为同步监视器
同步方法中无需指定同步监视器 , 因为同步方法的同步监视器就是this , 就是 这个对象本身 , 或者是 class
同步监视器的执行过程
- 第一个线程访问 , 锁定同步监视器 , 执行其中代码 。
- 第二个线程访问 , 发现同步监视器被锁定 , 无法访问 。
- 第一个线程访问完毕 , 解锁同步监视器 。
- 第二个线程访问, 发现同步监视器没有锁 , 然后锁定并访。
最新文章
- 用shell在一个文件后面的每一行追加数据
- DLL中传递STL参数(如Vector或者list等)会遇到的问题[转载]
- VerbalExpressions ——另类正则表达式
- c++学习笔记——构造函数
- 柬埔寨手机上网资费套餐(3G/4G上网)
- (并查集)~APTX4869(fzu 2233)
- Windows Server 2016软件定义存储:Storage Spaces Direct的关键特性
- Linux 日志文件utmp、wtmp、lastlog、messages
- dota BP练习工具开发:一个C/S多用户程序
- JavaScript 网址
- inline-block总结
- Kali安全测试相关书籍
- 微软在MSDN中更新了Win8.1批量授权版镜像(中文版更新完毕&;版本说明)
- Android OpenGL ES(十一)绘制一个20面体 .
- 分享几个python小脚本
- Shiro中的授权问题(二)
- Saltstack_使用指南06_远程执行-指定目标
- Intent 跳转Activity
- 【BZOJ4554】【TJOI2016】【HEOI2016】游戏
- 浅谈java中";&;&;";和";&;";的区别
热门文章
- 攻防世界NewsCenter
- (6) 结论,摘要与题目_Conclusion, Abstract, and Title【论文写作】
- 220v-5v稳压电路
- PCB布线总的原则
- Blazor组件自做二 : 使用JS隔离制作手写签名组件
- 在Blazor中实现拖放(drag and drop)
- 论文解读(MCGC)《Multi-view Contrastive Graph Clustering》
- 【LeetCode】567. 字符串的排列
- Mybatis结果集映射问题
- CVPR 2022数据集汇总|包含目标检测、多模态等方向