java中多线程加锁的四种方式

 更新时间:2024年10月18日 08:35:27   作者:我叫汪枫  
Java中实现多线程安全的关键是加锁,主要方式有synchronized关键字、ReentrantLock类、ReadWriteLock接口和Semaphore类,本文就来介绍一下这四种方式,感兴趣的可以了解一下

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

1. 使用synchronized关键字

synchronized可以用于方法或代码块,确保只有一个线程能访问被锁定的代码。

方法锁

class SynchronizedMethod {
    public synchronized void synchronizedMethod() {
        System.out.println("Synchronized method executed by " + Thread.currentThread().getName());
    }
}

代码块锁

class SynchronizedBlock {
    private final Object lock = new Object();

    public void synchronizedBlock() {
        synchronized (lock) {
            System.out.println("Synchronized block executed by " + Thread.currentThread().getName());
        }
    }
}

2. 使用ReentrantLock类

ReentrantLockjava.util.concurrent.locks包中的一种锁,具有比synchronized更灵活的锁定机制。

import java.util.concurrent.locks.ReentrantLock;

class ReentrantLockExample {
    private final ReentrantLock lock = new ReentrantLock();

    public void lockMethod() {
        lock.lock();
        try {
            System.out.println("ReentrantLock method executed by " + Thread.currentThread().getName());
        } finally {
            lock.unlock();
        }
    }
}

3. 使用读写锁(ReadWriteLock)

ReadWriteLock允许多个读线程同时访问共享资源,但在写线程访问时,阻止其他线程的读和写访问。

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

class ReadWriteLockExample {
    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

    public void readMethod() {
        readWriteLock.readLock().lock();
        try {
            System.out.println("Read lock method executed by " + Thread.currentThread().getName());
        } finally {
            readWriteLock.readLock().unlock();
        }
    }

    public void writeMethod() {
        readWriteLock.writeLock().lock();
        try {
            System.out.println("Write lock method executed by " + Thread.currentThread().getName());
        } finally {
            readWriteLock.writeLock().unlock();
        }
    }
}

4. 使用信号量(Semaphore)

Semaphore是一种计数信号量,可以限制同时访问某个资源的线程数量。

import java.util.concurrent.Semaphore;

class SemaphoreExample {
    private final Semaphore semaphore = new Semaphore(2); // 允许最多两个线程访问

    public void accessResource() {
        try {
            semaphore.acquire();
            System.out.println("Accessing resource by " + Thread.currentThread().getName());
            Thread.sleep(1000); // 模拟工作
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            semaphore.release();
        }
    }
}

总结

  • synchronized是 Java 内置的关键字,易于使用,但灵活性不足。
  • ReentrantLock提供了更强大的锁控制能力,如可重入锁、超时锁。
  • ReadWriteLock允许更高效地处理读写操作,适用于读多写少的场景。
  • Semaphore可以控制访问资源的线程数量,适合有限资源的场景。

这些加锁机制可以帮助你在多线程环境中实现线程安全的访问

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

相关文章

  • Java中List的使用方法简单介绍

    Java中List的使用方法简单介绍

    这篇文章主要针对Java中List的使用方法为大家介绍了进行简单介绍,List是个集合接口,只要是集合类接口都会有个“迭代子”( Iterator ),利用这个迭代子,就可以对list内存的一组对象进行操作,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • SpringSecurity HttpSecurity 类处理流程分析

    SpringSecurity HttpSecurity 类处理流程分析

    SpringSecurity在SSM项目中使用基于配置文件,通过XML标签定义认证信息,HttpSecurity在SpringBoot中通过代码配置实现与XML相同功能,详细介绍了HttpSecurity的类结构、处理过程及其与SecurityBuilder的关系,感兴趣的朋友一起看看吧
    2024-09-09
  • Java中如何将JSON格式的字符串转换为Map

    Java中如何将JSON格式的字符串转换为Map

    在 Java 中,将 JSON 格式的字符串转换为 Map可以借助一些流行的 JSON 处理库来实现,下面为你介绍使用 Gson 和 Jackson 这两个常用库的方法,感兴趣的朋友一起看看吧
    2025-04-04
  • SpringBoot原生组件注入实现两种方式介绍

    SpringBoot原生组件注入实现两种方式介绍

    SpringBoot是Spring全家桶的成员之一,基于约定优于配置的思想(即有约定默认值,在不配置的情况下会使用默认值,在配置文件下配置的话会使用配置的值)。SpringBoot是一种整合Spring技术栈的方式(或者说是框架),同时也是简化Spring的一种快速开发的脚手架
    2022-10-10
  • Java中List集合的常用方法详解

    Java中List集合的常用方法详解

    这篇文章主要为大家详细介绍了Java中List集合的常用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • mybatis plus框架@TableField注解不生效问题及解决方案

    mybatis plus框架@TableField注解不生效问题及解决方案

    最近遇到一个mybatis plus的问题,@TableField注解不生效,导致查出来的字段反序列化后为空,今天通过本文给大家介绍下mybatis plus框架的@TableField注解不生效问题总结,需要的朋友可以参考下
    2022-03-03
  • spring boot 加载web容器tomcat流程源码分析

    spring boot 加载web容器tomcat流程源码分析

    本文章主要描述spring boot加载web容器 tomcat的部分,为了避免文章知识点过于分散,其他相关的如bean的加载,tomcat内部流程等不做深入讨论,具体内容详情跟随小编一起看看吧
    2021-06-06
  • Spring Boot集成Druid查看配置是否生效的方法

    Spring Boot集成Druid查看配置是否生效的方法

    本文主要介绍了Spring Boot集成Druid查看配置是否生效的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Spring Security自定义身份认证的实现方法

    Spring Security自定义身份认证的实现方法

    这篇文章主要介绍了Spring Security自定义身份认证的实现方法,下面对Spring Security的这三种自定义身份认证进行详细讲解,需要的朋友可以参考下
    2025-04-04
  • java数据类型和运算符的深入讲解

    java数据类型和运算符的深入讲解

    这篇文章主要给大家介绍了关于java数据类型和运算符的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论