通过示例讲解Java有哪些加锁方式

 更新时间:2025年06月18日 10:26:00   作者:五道书童  
在Java中加锁是一种同步机制,用于控制对共享资源的并发访问,以防止多个线程同时修改数据,从而避免数据不一致和并发问题,这篇文章主要介绍了Java有哪些加锁方式的相关资料,需要的朋友可以参考下

在Java中,加锁的方式主要有以下几种:

1. synchronized 关键字

synchronized 是Java中最基本的加锁机制,可以用于方法或代码块。

  • 实例方法

    public synchronized void method() {
        // 同步代码
    }
    

    锁的是当前实例对象。

  • 静态方法

    public static synchronized void staticMethod() {
        // 同步代码
    }
    

    锁的是当前类的 Class 对象。

  • 代码块

    public void method() {
        synchronized (this) {
            // 同步代码
        }
    }
    

    锁的是指定对象。

2. ReentrantLock

ReentrantLock 是 java.util.concurrent.locks 包中的类,提供了比 synchronized 更灵活的锁机制。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Example {
    private final Lock lock = new ReentrantLock();

    public void method() {
        lock.lock();  // 加锁
        try {
            // 同步代码
        } finally {
            lock.unlock();  // 释放锁
        }
    }
}

3. ReadWriteLock

ReadWriteLock 是一种读写锁,允许多个读线程同时访问,但写线程独占锁。

import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class Example {
    private final ReadWriteLock rwLock = new ReentrantReadWriteLock();

    public void readMethod() {
        rwLock.readLock().lock();
        try {
            // 读操作
        } finally {
            rwLock.readLock().unlock();
        }
    }

    public void writeMethod() {
        rwLock.writeLock().lock();
        try {
            // 写操作
        } finally {
            rwLock.writeLock().unlock();
        }
    }
}

4. StampedLock

StampedLock 是Java 8引入的锁机制,支持乐观读锁、悲观读锁和写锁。

import java.util.concurrent.locks.StampedLock;

public class Example {
    private final StampedLock stampedLock = new StampedLock();

    public void readMethod() {
        long stamp = stampedLock.readLock();
        try {
            // 读操作
        } finally {
            stampedLock.unlockRead(stamp);
        }
    }

    public void writeMethod() {
        long stamp = stampedLock.writeLock();
        try {
            // 写操作
        } finally {
            stampedLock.unlockWrite(stamp);
        }
    }

    public void optimisticReadMethod() {
        long stamp = stampedLock.tryOptimisticRead();
        // 读操作
        if (!stampedLock.validate(stamp)) {
            stamp = stampedLock.readLock();
            try {
                // 重新读操作
            } finally {
                stampedLock.unlockRead(stamp);
            }
        }
    }
}

5. Semaphore

Semaphore 是一种计数信号量,用于控制同时访问特定资源的线程数量。

import java.util.concurrent.Semaphore;

public class Example {
    private final Semaphore semaphore = new Semaphore(10); // 允许10个线程同时访问

    public void method() throws InterruptedException {
        semaphore.acquire();  // 获取许可
        try {
            // 同步代码
        } finally {
            semaphore.release();  // 释放许可
        }
    }
}

6. Condition

Condition 通常与 ReentrantLock 配合使用,用于线程间的协调。

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Example {
    private final Lock lock = new ReentrantLock();
    private final Condition condition = lock.newCondition();

    public void awaitMethod() throws InterruptedException {
        lock.lock();
        try {
            condition.await();  // 等待
        } finally {
            lock.unlock();
        }
    }

    public void signalMethod() {
        lock.lock();
        try {
            condition.signal();  // 唤醒
        } finally {
            lock.unlock();
        }
    }
}

7. Atomic 类

Atomic 类(如 AtomicIntegerAtomicReference 等)通过CAS(Compare-And-Swap)实现无锁同步。

import java.util.concurrent.atomic.AtomicInteger;

public class Example {
    private final AtomicInteger atomicInteger = new AtomicInteger(0);

    public void increment() {
        atomicInteger.incrementAndGet();  // 原子操作
    }
}

8. LockSupport

LockSupport 提供了线程阻塞和唤醒的基本操作。

import java.util.concurrent.locks.LockSupport;

public class Example {
    public void parkMethod() {
        LockSupport.park();  // 阻塞当前线程
    }

    public void unparkMethod(Thread thread) {
        LockSupport.unpark(thread);  // 唤醒指定线程
    }
}

总结

  • synchronized:简单易用,适合大多数场景。
  • ReentrantLock:提供更多功能,如可中断锁、超时锁等。
  • ReadWriteLock:适合读多写少的场景。
  • StampedLock:性能更高,适合复杂场景。
  • Semaphore:控制资源访问数量。
  • Condition:用于线程间协调。
  • Atomic 类:无锁同步,适合简单操作。
  • LockSupport:底层线程阻塞和唤醒工具。

根据具体需求选择合适的加锁方式。

到此这篇关于Java有哪些加锁方式的文章就介绍到这了,更多相关Java加锁方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java Scanner的使用和hasNextXXX()的用法说明

    Java Scanner的使用和hasNextXXX()的用法说明

    这篇文章主要介绍了Java Scanner的使用和hasNextXXX()的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java异常处理拦截器详情

    java异常处理拦截器详情

    这篇文章主要介绍了java异常处理拦截器,使用异常处理拦截器,可以不用写那么多try…catch…,下面就来学习关于java异常处理拦截器的详情内容吧,需要的朋友可以参考一下
    2021-10-10
  • Spring常见的事务失效场景及解决方案

    Spring常见的事务失效场景及解决方案

    Spring 事务管理是企业级应用开发中不可或缺的一部分,它可以帮助我们确保数据的一致性和完整性,然而,在实际开发中,由于各种原因,事务可能会失效,本文将详细介绍 Spring 事务失效的常见情况,并提供相应的解决方案和示例代码,需要的朋友可以参考下
    2024-11-11
  • Spring数据源及配置文件数据加密实现过程详解

    Spring数据源及配置文件数据加密实现过程详解

    这篇文章主要介绍了Spring数据源及配置文件数据加密实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • AgentScope Java 入门到进阶指南

    AgentScope Java 入门到进阶指南

    AgentScopeJava是一个面向智能体的编程框架,用于构建基于大语言模型的应用,它提供了智能体所需功能,本文给大家介绍AgentScope Java 入门到进阶,感兴趣的朋友一起看看吧
    2026-04-04
  • java字符串中提取数字的方法

    java字符串中提取数字的方法

    Java中提取字符串中的数字,可以使用正则表达式或非正则表达式的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-06-06
  • Java遍历HashMap的6种常见方式

    Java遍历HashMap的6种常见方式

    这篇文章主要给大家介绍了关于Java遍历HashMap的6种常见方式,方法包括使用keySet()、entrySet()、forEach()、迭代器以及分别遍历键和值,文中给出了详细的代码示例,需要的朋友可以参考下
    2025-05-05
  • Java高性能缓存框架之Caffeine详解

    Java高性能缓存框架之Caffeine详解

    这篇文章主要介绍了Java高性能缓存框架之Caffeine详解,Caffeine是一个基于Java8的高性能缓存框架,号称趋于完美,Caffeine受启发于Guava Cache的API,使用API和Guava是一致的,需要的朋友可以参考下
    2023-12-12
  • java常用工具类之DES和Base64加密解密类

    java常用工具类之DES和Base64加密解密类

    这篇文章主要介绍了java常用工具类之DES和Base64加密解密类,需要的朋友可以参考下
    2014-07-07
  • Java线程优先级和守护线程原理解析

    Java线程优先级和守护线程原理解析

    这篇文章主要介绍了Java线程优先级和守护线程原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论