首页 > 编程语言 >Java 开发中锁的选择与使用

Java 开发中锁的选择与使用

时间:2024-09-13 16:51:08浏览次数:3  
标签:count Java synchronized lock ReentrantLock 开发 线程 中锁 public

Java 开发中锁的选择与使用

1. 引言

在并发编程中,锁是一种常见的机制,用于解决多线程环境下的资源共享问题。合理地使用锁可以有效地提高程序的正确性和性能。

2. Java 中的锁机制

Java 提供了多种锁机制,主要包括:

  • synchronized 关键字
  • ReentrantLock 类
  • ReadWriteLock 接口
  • Atomic 类
3. synchronized 关键字

synchronized 是 Java 语言内置的关键字,可以修饰方法或者同步代码块,使得同一时刻只有一个线程可以执行被同步的代码段。

示例
public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}
好处
  • 简单易用synchronized 的使用非常直观,易于理解和实现。
  • 隐式锁管理:JVM 自动管理锁的获取和释放,减少了手动管理锁的复杂度。
注意点
  • 死锁风险:如果多个 synchronized 块或方法使用不同的对象作为锁,则有可能引发死锁。
  • 不可中断:如果一个线程已经获得了锁,其他线程只能等待,除非持有锁的线程抛出异常或主动释放锁。
  • 性能问题:在高并发环境下,synchronized 可能会导致性能瓶颈。
4. ReentrantLock 类

ReentrantLock 是 Java 并发库中的一个类,提供了比 synchronized 更多的功能,如可中断、公平锁、尝试锁等。

示例
import java.util.concurrent.locks.ReentrantLock;

public class Counter {
    private int count = 0;
    private final ReentrantLock lock = new ReentrantLock();

    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }

    public int getCount() {
        lock.lock();
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }
}
好处
  • 可中断性:等待锁的线程可以被中断。
  • 公平锁:可以选择是否使用公平锁策略,公平锁可以按照请求锁的顺序进行分配。
  • 尝试锁:可以尝试获取锁而不立即阻塞。
注意点
  • 手动管理锁:需要显式地获取和释放锁,否则可能导致资源泄露。
  • 性能开销:相比 synchronizedReentrantLock 可能会有一定的性能开销。
5. ReadWriteLock 接口

ReadWriteLock 是一种特殊的锁机制,允许多个线程同时读取共享资源,但在写入时独占资源。这在读操作远多于写操作的场景下非常有用。

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

public class DataStore {
    private final ReadWriteLock lock = new ReentrantReadWriteLock();
    private String data = "";

    public void writeData(String newData) {
        lock.writeLock().lock();
        try {
            data = newData;
        } finally {
            lock.writeLock().unlock();
        }
    }

    public String readData() {
        lock.readLock().lock();
        try {
            return data;
        } finally {
            lock.readLock().unlock();
        }
    }
}
好处
  • 读写分离:允许多个线程同时读取共享资源,提高了并发性能。
  • 减少阻塞:读操作不会阻塞其他读操作,只有写操作才会阻塞其他读写操作。
注意点
  • 复杂性增加:使用 ReadWriteLock 需要更复杂的锁管理逻辑。
  • 公平性问题:默认的 ReentrantReadWriteLock 不是公平锁,可能会影响性能。
6. Atomic 类

Atomic 类提供了一种无锁的原子更新方式,适用于简单的数据类型更新,如 AtomicIntegerAtomicLong 等。

示例
import java.util.concurrent.atomic.AtomicInteger;

public class Counter {
    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        count.incrementAndGet();
    }

    public int getCount() {
        return count.get();
    }
}
好处
  • 无锁更新:适用于简单的数据类型更新,可以避免锁的开销。
  • 性能优化:在单线程或多线程环境下都能提供较好的性能。
注意点
  • 适用范围有限:仅适用于简单的数据类型更新,不适用于复杂的业务逻辑。
  • 线程安全性限制:对于复杂的业务逻辑,仍需使用其他锁机制来保证线程安全。
7. 锁的选择与对比

选择锁的方式应根据具体的应用场景和需求来决定:

  • 简单同步:如果只需要简单的同步控制,并且不关心锁的高级特性,可以使用 synchronized
  • 高级功能:如果需要更高级的锁功能,如公平锁、非阻塞锁尝试、中断等待锁的能力等,应该使用 ReentrantLock
  • 读多写少:如果场景中读操作远多于写操作,可以考虑使用 ReadWriteLock
  • 原子更新:对于简单的数据类型更新,可以使用 Atomic 类来提高性能。

标签:count,Java,synchronized,lock,ReentrantLock,开发,线程,中锁,public
From: https://blog.csdn.net/weixin_42564451/article/details/142215046

相关文章

  • 电子体温计芯片方案设计与开发
    电子体温计是一种以电子电路为核心的温度测量仪器,具有测量速度快、温度分辨率高、测量结果准确可靠、使用方便等特点。电子体温计主要用于检测人体体温,可分为接触式和非接触式两大类。传统的体温计是通过水银温度计来测温的,这种温度计的使用方法是:将体温计的水银柱末端浸入液......
  • 旅游网站开发:SpringBoot框架高级应用
    第五章系统的实现5.1登录界面登录窗口,用户通过登录窗口可以进行登录或注册。还没注册的用户可以进行填写用户名、密码进行注册操作,如图5-1所示,图5-2登录窗口界面5.2管理员功能模块用户登录成功后,可以进行查看个人中心、用户管理、路线分类管理、旅游路线管理、最新路......
  • Java面试随手记3
    一、面试题总结31、mysql中char和varchar的区别?特性charvarchar存储方式定长,长度不足时填充空格可变长,按实际长度存储存储效率固定空间,浪费内存根据实际长度动态分配性能较高,适合固定长度数据稍低,适合不定长度数据适用场景固定长度的字符串不定长度的字符串空格处理自动去......
  • Java
    在Java中变量需要初始化,不然系统会报错,在Java中生成随机数,需要运用random这个工具,也是需要办含头文件,()里面是需要生成随机数的范围 Java输入一个数需要到scanner这个工具,需要包含头文件,需要输入什么类型,就在next后面加上类型名字就可以了,读取完后需要关闭这个文件  在Jav......
  • 学习高校课程-软件设计模式-OOP 和 UML 类图 OOP 与 Java(lec1)
    Lecture1:OOPandUMLClassDiagramsOOPwithJavaOOP和UML类图OOP与JavaObject-OrientedProgramming面向对象编程ClassHierarchies类层次结构Superclassandsubclass超类和子类PillarsofObject-OrientedProgramming面向对象编程的支柱Abstraction–M......
  • java中cloneable接口的作用是什么
    在Java中,Cloneable接口是一个标记接口,它没有任何方法。它的存在是为了告诉编译器,该类可以被克隆(复制)。通过实现Cloneable接口,表示该类的实例可以通过调用clone()方法进行复制。clone()方法是Object类中的一个protected方法,它用于创建并返回一个与原始对象相同的副本。需要注意的......
  • 游戏客户端中的网络通信:使用Java实现实时数据交换| 网络通信|Java|游戏客户端
    在现代游戏开发中,Java作为一种强大的编程语言,广泛应用于游戏客户端的开发。Java的跨平台特性、丰富的类库以及强大的社区支持使其成为开发高性能、可维护的游戏客户端的理想选择。从简单的2D游戏到复杂的3D游戏,Java能够提供稳健的解决方案来应对各种挑战。本篇文章将深入探讨如何利......
  • 基于JAVA办公自动化系统的计算机毕设
    摘  要极光办公自动化系统是针对南开创元信息技术有限公司开发的,专门用于企业内部员工信息交流的软件,其开发过程主要包括前端应用程序的开发和后端数据库的建立两个方面。对于前者要求应用程序功能完备操作简单,对于后者要求建立起数据一致性、完整性和安全性好的数据库。本论......
  • 经典前端+后端+表头+表身的开发实战参考简易模板【珍藏】
    前端部分(Vue3+ElementPlus)1.修改MPS002HList.vue(主生产计划列表)a.添加查询表单在模板中添加查询表单,包含产品料号、品名、规格和年月的输入项。<template><div><!--查询表单--><el-form:inline="true":model="filters"class="demo-form-inline&qu......
  • Java【异常处理】
    机制概述JVM用方法调用栈来跟踪一系列方法的调用过程,位于栈顶的是正在执行的方法,当一个方法抛出异常时,根据代码处理异常。异常常见类型 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这些异常在编译时强制要求程序员处理。运行时异常: 这些异常在编译时不强......