线程同步的方法
在 Java 中,实现线程同步(确保多个线程安全访问共享资源)主要有以下方法,均使用中文描述:
1. synchronized 关键字
- 同步代码块:手动指定锁对象(任意对象或类对象)
synchronized (lockObject) { // 临界区代码 } - 同步实例方法:锁对象为当前实例(
this)public synchronized void method() { // 临界区代码 } - 同步静态方法:锁对象为类的
Class对象(全局锁)public static synchronized void staticMethod() { // 临界区代码 }
2. 显式锁 (java.util.concurrent.locks.Lock)
使用 ReentrantLock 实现更灵活的同步(支持公平锁、可中断锁):
Lock lock = new ReentrantLock();
lock.lock(); // 手动加锁
try {
// 临界区代码
} finally {
lock.unlock(); // 必须在finally中释放锁
}
- 优点:支持尝试锁(
tryLock())、超时锁、条件变量(Condition)。
3. volatile 关键字
- 确保变量的可见性(直接读写主内存,禁止缓存优化)
- 适用场景:单次读/写操作的原子性(如
boolean标志位),但不能替代锁。private volatile boolean flag = false;
4. 原子类 (java.util.concurrent.atomic)
基于 CAS(Compare-And-Swap)实现无锁线程安全:
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet(); // 原子自增
- 支持
AtomicInteger、AtomicLong、AtomicReference等。
5. wait() / notify() / notifyAll()
- 协作机制(需在
synchronized块内调用):wait():释放锁并进入等待队列。notify()/notifyAll():唤醒等待线程。synchronized (lock) { while (条件不满足) { lock.wait(); // 释放锁并等待 } // 执行业务逻辑 lock.notifyAll(); // 唤醒其他等待线程 }
6. 并发工具类 (java.util.concurrent)
CountDownLatch:等待多个线程完成再继续。CyclicBarrier:多个线程到达屏障点后同时继续。Semaphore:控制同时访问资源的线程数(信号量)。Exchanger:线程间交换数据。
关键区别总结
| 方法 | 特点 |
|---|---|
synchronized |
JVM 内置锁,自动释放锁,简单但功能有限。 |
ReentrantLock |
API 更灵活(超时、可中断、公平锁),需手动释放锁。 |
volatile |
仅保障可见性和有序性,不保证复合操作的原子性。 |
| 原子类 | 无锁 CAS 实现,高性能的简单原子操作。 |
wait()/notify() |
线程间协作机制,必须与 synchronized 配合使用。 |
| 并发工具类 | 提供高层同步模型(如计数屏障、信号量等),简化复杂场景。 |
根据场景需求选择合适的方法:
- 简单同步 →
synchronized - 高性能需求 → 原子类
- 灵活控制 →
ReentrantLock - 线程协作 →
wait()/notify()或并发工具类。
AQS如何解决线程同步与通信问题
我们在第一篇中说到AQS使用的是管程模型,而管程模型是使用条件变量来解决同步通信问题的。条件变量会有两个方法,唤醒和等待。当条件满足时,我们会通过唤醒方法
2023-10-13 11:23:40
RT-Thread学习笔记 --(5)RT-Thread线程间同步学习过程总结
多线程之间同步是继多线程学习之后,需要重点掌握的又一个重要内容。一个实时操作系统里面,如果只有多
资料下载
李泽明
2022-01-25 18:52:59
使用C#实现Interlocked线程同步的程序免费下载
本文档的主要内容详细介绍的是使用C#实现Interlocked线程同步的程序免费下载。
资料下载
fuhuibin
2020-07-21 08:00:00
如何利用基于字节码插桩实现的多线程调试工具
在软件演化过程中,代码的调试是不可或缺的重要环节。对于多线程程序,线程的交错和调度是非确定的,不同的线程调度会产生不同的结果,程序员较难调试多
资料下载
佚名
2020-07-06 14:13:08
Java并发编程中线程同步的常用手段synchronized用法
synchronized关键字是Java并发编程中线程同步的常用手段之一,其作用有三个: 互斥性:确保线程互斥的访问
2021-04-04 11:30:00
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 什么是场效应管?它的作用是什么?
- 如何进行编码器的正确接线?接线方法介绍
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- 苹果nfc功能怎么复制门禁卡
- amoled屏幕和oled区别
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 通讯隔离作用
- 苹果笔记本macbookpro18款与19款区别
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机