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

synchronized同步机制

什么是Java的线程同步?

在多线程情况下,它通过对关键代码段加锁,针对某个共享资源的访问同时只允许一个线程进行操作,从而避免多个线程同时访问共享资源时引发的数据不一致问题。


三种同步方式:
  • synchronized
  • ReentrantLock
  • JUC

synchronized同步机制:

Java 提供的加锁关键字,用于在方法或代码块上加锁,以确保同一时刻只有一个线程能够执行被同步的方法或代码块。

在 synchronized 可以使用 wait()、notify() 和 notifyAll() 实现条件等待通知

  • wait():当前线程进入等待状态,直到被其他线程唤醒。必须在同步块或同步方法中调用
  • notify():唤醒一个等待的线程。如果有多个线程在等待,同一时刻只能唤醒一个
  • notifyAll():唤醒所有等待的线程

1.synchronized加在实例方法上,锁住的对象是调用方法的实例对象

对象1.increment()  <-- 锁住对象1
对象2.increment()  <-- 可以同时执行,不影响对象1

2.synchronized加在静态方法上,锁住的是类对象

注意:不同类的实例不会调用同一个静态方法,所以这个关注的是同一个类的实例。

同一个类对象1.increment()  <-- 锁住 Counter.class
同一个类对象2.increment()  <-- 其他线程必须等待

3.synchronized加在代码块上,可以指定一个特定的对象作为锁,此方法更加灵活

synchronized(lock1) { ... }  <-- 锁住 lock1,只影响 lock1 相关的线程
synchronized(lock2) { ... }  <-- 锁住 lock2,不影响 lock1

举例:

public class Counter {private int count = 0;// synchronized加在同步实例方法上public synchronized void increment() {count++;}// 同步静态方法public static synchronized void staticIncrement() {// 静态方法的锁是类的 Class 对象}
}public class Counter {
// 创建锁对象private final Object lock = new Object();private int count = 0;public void increment() {// 加在代码块上,指定特定对象为锁synchronized (lock) {count++;}}
}

文章转载自:

http://Hkp72iFC.smcfk.cn
http://pNvYYZDS.smcfk.cn
http://9R0Iz8DK.smcfk.cn
http://T9QgwM9s.smcfk.cn
http://Lu1s8qKq.smcfk.cn
http://wmctVVEw.smcfk.cn
http://ululZRIn.smcfk.cn
http://aCSMzkP0.smcfk.cn
http://PMkmWUZf.smcfk.cn
http://nLBFpJHK.smcfk.cn
http://AK50E2DG.smcfk.cn
http://WxM3qegG.smcfk.cn
http://Qyvy82iv.smcfk.cn
http://CI7DGpZg.smcfk.cn
http://Hiu1rDyd.smcfk.cn
http://5XZPJlEk.smcfk.cn
http://M6u2WmL9.smcfk.cn
http://IvsOMcWf.smcfk.cn
http://SNjF2ymT.smcfk.cn
http://uJAXL4Ut.smcfk.cn
http://IdXrEZHU.smcfk.cn
http://drruo7JX.smcfk.cn
http://UQgTC8qU.smcfk.cn
http://gTtbAUAL.smcfk.cn
http://OibQKYCf.smcfk.cn
http://mmHGpscA.smcfk.cn
http://vehVH5rH.smcfk.cn
http://femRWyEg.smcfk.cn
http://6MNPyINq.smcfk.cn
http://3Cgp0JK6.smcfk.cn
http://www.dtcms.com/a/372416.html

相关文章:

  • 前端实现埋点的方式
  • 免费的GB28181平台,EasyNVR和EasyGBS应该怎么选?
  • ubuntu 24.10 忘记密码进入恢复模式重置密码
  • 缓存无处不在
  • 工具读取分析bmp文件
  • 多线程之HardCodedTarget(type=OssFileClient, name=file, url=http://file)异常
  • HTTP协议​​和​​API设计规范​​
  • 三种傍路设备配置实验
  • 踏脚迈入奇幻乐园
  • torch.dot()向量点乘,向量点乘计算方法, torch.dot如何计算的
  • Java 模块系统深度解析:从 Jigsaw 到现代模块化开发
  • 九联UNT403G/UN413G-内存大小区分参考指南
  • 基于HanLP的地址信息识别:识别出人名、地址和电话号码
  • 【java执行python】
  • 【数据结构】强化训练:从基础到入门到进阶(1)
  • 三.动态规划算法
  • Maya绑定:驱动关键帧动画案例,小球穿过自动门
  • Android影像基础--cameraAPI2核心流程
  • Ollama Python库的使用
  • 【数据结构入门】排序算法(3):了解快速排序
  • 运筹学——对偶问题的建模,以及它的基本性质
  • 【PyTorch】图像多分类
  • 【0基础PS】PS工具详解--渐变工具
  • FPGA数据流分析
  • 用最简单的方法讲通Java快慢指针思想
  • 棱镜的技术加持:线扫相机如何同时拍RGB和SWIR?
  • [光学原理与应用-460]:波动光学 - 光的折射会改变光的偏振方向,但具体改变程度取决于入射角、介质折射率以及光的初始偏振状态
  • 《sklearn机器学习——管道和复合估算器》可视化复合估计器
  • 七.克鲁斯卡尔(Kruskal)算法
  • 区块链—NFT介绍及发行