当前位置: 首页 > news >正文

【多线程面试题 六】、 如何实现线程同步?

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。

面试官: 如何实现线程同步?

参考答案:

1、同步方法

  • 即有synchronized关键字修饰的方法,由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。需要注意, synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类。

2、同步代码块

  • 即有synchronized关键字修饰的语句块,被该关键字修饰的语句块会自动被加上内置锁,从而实现同步。需值得注意的是,同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。

3、ReentrantLock

  • Java 5新增了一个java.util.concurrent包来支持同步,其中ReentrantLock类是可重入、互斥、实现了Lock接口的锁,它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力。需要注意的是,ReentrantLock还有一个可以创建公平锁的构造方法,但由于能大幅度降低程序运行效率,因此不推荐使用。

4、volatile

  • volatile关键字为域变量的访问提供了一种免锁机制,使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新,因此每次使用该域就要重新计算,而不是使用寄存器中的值。需要注意的是,volatile不会提供任何原子操作,它也不能用来修饰final类型的变量。

5、原子变量

  • 在java的util.concurrent.atomic包中提供了创建了原子类型变量的工具类,使用该类可以简化线程同步。例如AtomicInteger 表可以用原子方式更新int的值,可用在应用程序中(如以原子方式增加的计数器),但不能用于替换Integer。可扩展Number,允许那些处理机遇数字类的工具和实用工具进行统一访问。
http://www.lryc.cn/news/209913.html

相关文章:

  • 地面文物古迹保护方案,用科技为文物古迹撑起“智慧伞”
  • k8s之Flannel网络插件安装提示forbidden无权限
  • 在微信小程序云开发中引入Vant Weapp组件库
  • Vue+ElementUI项目打包部署到Ubuntu服务器中
  • 面试题收集——Java基础部分(一)
  • Vue中this指向问题
  • 【iPad已停用】解锁教程
  • python不调用heapq库 实现大顶堆,小顶堆
  • STM32F4X SDIO(二) SDIO协议
  • 设计模式--7个原则
  • AltiumDesigner原理图编译错误报告信息解释
  • 使用 Visual Studio Code 编写 TypeScript程序
  • 科大讯飞发布讯飞星火 3.0;开源AI的现状
  • 公网远程访问macOS本地web服务器
  • windows 安装小乌龟
  • toon boom harmony基础
  • JPA联合主键
  • 水性杨花:揭秘CSS响应式界面设计,让内容灵活自如,犹如水之变幻
  • fio performance test
  • DevOps持续集成-Jenkins(1)
  • Pytorch代码入门学习之分类任务(二):定义数据集
  • oracle 里常用的一些 create insert update table
  • 从Mysql架构看一条查询sql的执行过程
  • Linux系统下DHCP服务安装部署和使用实例详解(蜜罐)
  • 模数转换器-ADC基础
  • Linux:【1】Linux中的文件权限概念和相关命令
  • JS实用小计
  • Android---Bitmap详解
  • 设计高信度和效度的问卷:关键要点与技巧
  • 从工厂到社会:探索如何应用设计模式工厂模式