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

`synchronized`关键字的作用及其实现原理,`wait()`、`notify()`和`notifyAll()`方法的用途及调用条件

synchronized关键字的作用及其实现原理

作用

synchronized关键字是Java中用于控制多个线程对共享资源访问的一个关键字。它确保了在同一时刻,只有一个线程可以执行某个方法或代码块(称为临界区或同步块),从而避免了并发操作可能导致的数据不一致和线程安全问题。

实现原理

  1. 锁机制synchronized关键字在Java中是通过锁机制实现的。每个Java对象都可以作为锁。当一个线程访问某个对象的synchronized方法或代码块时,它会先尝试获取该对象的锁。如果该锁已被其他线程持有,则该线程会被阻塞,直到锁被释放。

  2. 对象锁与类锁

    • 对象锁: 当访问某个对象的synchronized实例方法时,实际上是获取了该对象的锁。对于不同的对象实例,锁是独立的。
    • 类锁(Class Lock): 如果在synchronized方法中使用了类的Class对象作为锁,那么该锁是对所有该类实例共享的,称为类锁。这种锁常用于静态同步方法。
  3. JVM层面的支持synchronized的实现依赖于JVM的底层机制,包括监视器锁(Monitor Locks)的概念。当线程进入同步块时,会尝试获取监视器锁,如果锁被其他线程持有,则当前线程会被阻塞,直到锁被释放。

wait()notify()notifyAll()方法的用途及调用条件

用途

这三个方法是Java中用于线程间通信的,它们必须在同步代码块或同步方法中调用,因为它们都依赖于对象锁。

  • wait(): 使当前线程等待(即阻塞),直到其他线程调用此对象的notify()方法或notifyAll()方法。调用wait()方法的线程会释放对象锁,进入等待队列。
  • notify(): 唤醒正在等待对象监视器上的单个线程。如果有多个线程在等待,选择哪个线程唤醒是任意的。
  • notifyAll(): 唤醒正在等待此对象监视器上的所有线程。

调用条件

  1. 必须在同步代码块或同步方法中调用: 因为这些方法依赖于对象锁,所以它们必须在synchronized块中调用,否则将抛出IllegalMonitorStateException异常。

  2. wait()notify()/notifyAll()必须成对使用: 通常在等待条件(由共享变量表示)不满足时调用wait(),在条件改变后,唤醒等待的线程,这些线程会重新检查条件。

  3. wait()会释放锁,notify()/notifyAll()不会释放锁: 调用wait()的线程会释放对象锁,并进入等待状态。而调用notify()notifyAll()的线程在唤醒其他线程后,仍然持有对象锁,直到它退出同步块或同步方法。

通过这些机制,Java实现了线程间的同步和通信,确保了多线程环境下数据的正确性和程序的安全性。


http://www.mrgr.cn/news/28604.html

相关文章:

  • 启动QT时,出现找不到python27.dll的问题报错
  • mmsegmentation: 安装 并使用自定义数据集进行训练 ·1
  • 如何禁用VMware虚拟网卡
  • Git学习教程(更新中)
  • 2分钟在阿里云ECS控制台部署个人应用(图文示例)
  • Ubuntu配置阿里云docker apt源
  • Gitee Pipeline 从入门到实战【详细步骤】
  • Docker 进阶篇-CIG 重量级监控系统
  • 神经网络通俗理解学习笔记(5) 自然语言处理
  • LeetCode题练习与总结:多数元素 Ⅱ--229
  • 嵌入式开发—CAN通信协议详解与应用(上)
  • 进程相关的系统调用
  • redis实现分布式锁详细教程,可续锁(看门狗)、可重入
  • 鸿蒙读书笔记2:《鸿蒙操作系统设计原理与架构》
  • C++学习笔记----7、使用类与对象获得高性能(二)---- 理解对象生命周期(2)
  • 3176. 求出最长好子序列 I
  • 计算机组成原理——计算机硬件组成与原理
  • Docker 容器网络技术
  • 【例题】lanqiao4425 咖啡馆订单系统
  • 基于python+django+vue的学生管理系统
  • Great_Data
  • Redis 主从复制
  • MaintenanceController
  • 鱼类计数与识别系统源码分享
  • 英语学习之fruit
  • a√跳房子