由于同一进程的多个线程共享同一块存储空间 , 在带来方便的同时,也带来了访问 冲突问题 , 为了保证数据在方法中被访问时的正确性 , 在访问时加入 锁机制synchronized , 当一个线程获得对象的排它锁 , 独占资源 , 其他线程必须等待 , 使用后释放锁即可 . 存在以下问题 :

  • 一个线程持有锁会导致其他所有需要此锁的线程挂起 ;
  • 在多线程竞争下 , 加锁 , 释放锁会导致比较多的上下文切换 和 调度延时,引 起性能问题 ;
  • 如果一个优先级高的线程等待一个优先级低的线程释放锁 会导致优先级倒 置 , 引起性能问题 。

同步方法

由于我们可以通过 private 关键字来保证数据对象只能被方法访问 , 所以我们只需 要针对方法提出一套机制 , 这套机制就是 synchronized 关键字 , 它包括两种用法 synchronize方法synchronized 块

//同步方法
public synchronized void method(int args){}

synchronized方法控制对 “对象” 的访问 , 每个对象对应一把锁 , 每个 synchronized方法都必须获得调用该方法的对象的锁才能执行 , 否则线程会阻塞 , 方法一旦执行 , 就独占该锁 , 直到该方法返回才释放锁 , 后面被阻塞的线程才能获 得这个锁 , 继续执行。

  • 若将一个大的方法申明为synchronized 将会影响效率

  • 方法里面需要修改的内容才需要锁, 锁的太多 ,浪费资源。

同步块

//同步块
synchronized (Obj){}
  • Obj 称之为 同步监视器

    • Obj 可以是任何对象 , 但是推荐使用共享资源作为同步监视器

    • 同步方法中无需指定同步监视器 , 因为同步方法的同步监视器就是this , 就是 这个对象本身 , 或者是 class

  • 同步监视器的执行过程

  1. 第一个线程访问 , 锁定同步监视器 , 执行其中代码 。
  2. 第二个线程访问 , 发现同步监视器被锁定 , 无法访问 。
  3. 第一个线程访问完毕 , 解锁同步监视器 。
  4. 第二个线程访问, 发现同步监视器没有锁 , 然后锁定并访。

最新文章

  1. 用shell在一个文件后面的每一行追加数据
  2. DLL中传递STL参数(如Vector或者list等)会遇到的问题[转载]
  3. VerbalExpressions ——另类正则表达式
  4. c++学习笔记——构造函数
  5. 柬埔寨手机上网资费套餐(3G/4G上网)
  6. (并查集)~APTX4869(fzu 2233)
  7. Windows Server 2016软件定义存储:Storage Spaces Direct的关键特性
  8. Linux 日志文件utmp、wtmp、lastlog、messages
  9. dota BP练习工具开发:一个C/S多用户程序
  10. JavaScript 网址
  11. inline-block总结
  12. Kali安全测试相关书籍
  13. 微软在MSDN中更新了Win8.1批量授权版镜像(中文版更新完毕&版本说明)
  14. Android OpenGL ES(十一)绘制一个20面体 .
  15. 分享几个python小脚本
  16. Shiro中的授权问题(二)
  17. Saltstack_使用指南06_远程执行-指定目标
  18. Intent 跳转Activity
  19. 【BZOJ4554】【TJOI2016】【HEOI2016】游戏
  20. 浅谈java中"&&"和"&"的区别

热门文章

  1. 攻防世界NewsCenter
  2. (6) 结论,摘要与题目_Conclusion, Abstract, and Title【论文写作】
  3. 220v-5v稳压电路
  4. PCB布线总的原则
  5. Blazor组件自做二 : 使用JS隔离制作手写签名组件
  6. 在Blazor中实现拖放(drag and drop)
  7. 论文解读(MCGC)《Multi-view Contrastive Graph Clustering》
  8. 【LeetCode】567. 字符串的排列
  9. Mybatis结果集映射问题
  10. CVPR 2022数据集汇总|包含目标检测、多模态等方向