Java提供了多种锁机制来实现多线程同步和互斥。
这些锁机制包括synchronized关键字、ReentrantLock【锐安屯】、ReentrantReadWriteLock、Semaphore【C莫法儿】、CountDownLatch等。下面分别介绍这些锁机制的使用方法:
synchronized关键字
- synchronized是Java中最简单的锁机制,它可以用来实现方法或者代码块的同步。synchronized关键字的使用方式有两种
- 一种是在方法声明中使用,另一种是在代码块中使用。
- 在方法声明中使用synchronized关键字:
| public synchronized void method() { |
| |
| } |
- 在代码块中使用synchronized关键字:其中,lock是一个共享的对象,synchronized关键字会对object进行加锁,在临界区代码执行期间,其他线程无法访问object。
| public class SynchronizedExample { |
| public void doSomething(Object lock) { |
| synchronized (lock) { |
| |
| } |
| } |
| } |
ReentrantLock
- ReentrantLock是Java中一个可重入的互斥锁,它提供了比synchronized更加灵活的同步方式。使用ReentrantLock需要先创建一个ReentrantLock对象,然后使用lock()方法获得锁,在finally块中使用unlock()方法释放锁。
| private final ReentrantLock lock = new ReentrantLock(); |
| |
| public void method() { |
| lock.lock(); |
| try { |
| |
| } finally { |
| lock.unlock(); |
| } |
| } |
ReentrantReadWriteLock
- ReentrantReadWriteLock是Java中一个可重入的读写锁,它提供了比ReentrantLock更加高效的读写操作。使用ReentrantReadWriteLock需要先创建一个ReentrantReadWriteLock对象,然后使用readLock()方法获得读锁,使用writeLock()方法获得写锁,在finally块中使用unlock()方法释放锁。
| private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); |
| |
| public void readMethod() { |
| lock.readLock().lock(); |
| try { |
| |
| } finally { |
| lock.readLock().unlock(); |
| } |
| } |
| |
| public void writeMethod() { |
| lock.writeLock().lock(); |
| try { |
| |
| } finally { |
| lock.writeLock().unlock(); |
| } |
| } |
Semaphore
- Semaphore是Java中一个计数信号量,它可以用来控制对某个共享资源的访问。Semaphore有一个初始的计数值,每次使用Semaphore时,计数值会减一,当计数值为0时,其他线程将无法访问共享资源。
| private final Semaphore semaphore = new Semaphore(10); |
| |
| public void method() throws InterruptedException { |
| semaphore.acquire(); |
| try { |
| |
| } finally { |
| semaphore.release(); |
| } |
| } |
CountDownLatch
- CountDownLatch是Java中一个同步辅助类,它可以用来等待一组线程执行完毕再继续执行。CountDownLatch有一个初始的计数值,每次调用countDown()方法时,计数值会减一,当计数值为0时,等待线程将被释放。
| private final CountDownLatch latch = new CountDownLatch(10); |
| |
| public void method() throws InterruptedException { |
| for (int i = 0; i < 10; i++) { |
| new Thread(() -> { |
| |
| latch.countDown(); |
| }).start(); |
| } |
| latch.await(); |
| |
| } |
以上是Java中常用的锁机制,不同的锁机制适用于不同的场景。在使用锁时,需要注意避免死锁、饥饿等问题,保证程序的正确性和效率。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~