首页 > 编程语言 >详细介绍java中的锁机制

详细介绍java中的锁机制

时间:2024-10-17 22:00:14浏览次数:7  
标签:同步 java synchronized lock ReentrantLock try 线程 详细 机制

Java中的锁机制是并发编程中用来确保多个线程在访问共享资源时不发生数据竞争的关键工具。Java提供了多种锁机制来帮助开发者管理线程同步,主要包括以下几种:

1. synchronized 锁

synchronized是Java中最基本的锁机制,它可以用来修饰方法或者代码块,从而确保同一时间只有一个线程可以执行被锁定的代码。根据使用场景的不同,synchronized可以分为以下两类:

  • 同步方法:通过在方法声明中使用 synchronized关键字,使得该方法只能被一个线程访问。例如:

    public synchronized void synchronizedMethod() {
        // 方法内容
    }
    

    当一个线程调用该方法时,其他线程必须等待直到该线程完成方法的执行。

  • 同步代码块:使用synchronized锁定某一块代码,而不是整个方法。这样可以更精细地控制锁的粒度,提升性能。例如:

    private Object lock=new Object();
    public void method() {
        synchronized(lock) {
            // 需要同步的代码
        }
    }
    

    这里锁的是当前对象lock,也可以指定其他对象作为锁。
    在 Java 中,任何对象都可以作为锁。Object 是所有 Java 类的基类,这意味着任何对象都隐式地继承了 Object 类的方法,包括用于同步的 wait()notify()notifyAll() 方法。 因此,使用 Object 作为锁可以方便地利用这些内置的同步机制。

注意synchronized是一个阻塞式的锁,当一个线程获取了锁,其他线程必须等待它释放锁后才能进入同步代码。这种机制适合小规模的同步需求,但在大规模并发下性能会受到影响。

2. ReentrantLock 锁

ReentrantLock是Java中一个更灵活的锁机制,它在java.util.concurrent.locks包中,是一种可重入锁。与synchronized相比,ReentrantLock提供了更多的功能,例如:

  • 手动释放锁:在synchronized中,锁会自动释放,而ReentrantLock需要手动释放锁,通常使用try-finally结构来确保锁最终被释放:

    ReentrantLock lock = new ReentrantLock();
    
    lock.lock();
    try {
        // 需要同步的代码
    } finally {
        lock.unlock();
    }
    
  • 公平锁与非公平锁:可以创建公平锁(根据请求锁的顺序来获取锁)和非公平锁(默认,可能会“插队”)。例如:

    ReentrantLock fairLock = new ReentrantLock(true); // 公平锁
    
  • 可中断的锁请求ReentrantLock支持线程在等待锁时可以响应中断操作,避免无限等待。

  • 锁尝试机制:提供tryLock()方法,在尝试获取锁时可以指定等待时间。如果在指定时间内获取不到锁,就放弃,避免了阻塞。例如:

    if (lock.tryLock(1000, TimeUnit.MILLISECONDS)) {
        try {
            // 需要同步的代码
        } finally {
            lock.unlock();
        }
    }
    

3. ReadWriteLock 读写锁

ReadWriteLock接口和它的实现类ReentrantReadWriteLock,提供了一种分离读锁和写锁的机制。其核心思想是:

  • 读锁:允许多个线程同时读取共享资源,适合读多写少的场景。
  • 写锁:在一个线程写数据时,不允许其他线程读或写。

这种机制可以有效提高并发性能。例如:

ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
rwLock.readLock().lock();
try {
    // 读操作
} finally {
    rwLock.readLock().unlock();
}

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

4. StampedLock

StampedLockReadWriteLock的改进版,主要用于高性能的读多写少场景。它引入了一个称为“戳”的概念,可以在读操作中乐观地获取锁。

  • 乐观读锁:不会阻止写操作,可以提升读操作的性能。在读操作时,若没有写锁,可以快速读取。如果写锁在读操作时发生,乐观读锁会自动失效,变成悲观读锁。
  • 悲观读锁写锁:类似于ReentrantReadWriteLock中的锁。

使用示例:

StampedLock stampedLock = new StampedLock();
long stamp = stampedLock.readLock();
try {
    // 读操作
} finally {
    stampedLock.unlockRead(stamp);
}

标签:同步,java,synchronized,lock,ReentrantLock,try,线程,详细,机制
From: https://www.cnblogs.com/pure4knowledge/p/18473203

相关文章

  • Java常用类和基础API
    目录一、String1.1String的理解1.1.1类的声明1.1.2内部声明的属性:1.2String的实例与连接1.2.1字符串常量的存储位置1.2.2 Strinq的不可变性的理解1.2.3String的连接操作:+1.3String的构造器与常用方法1.3.1常用方法1.4String的课后练习题目1题目2题目......
  • Java-三种线程的实现方式
    1.继承Thread类可以通过创建一个新的类继承Thread类,并重写其run方法来实现线程。classMyThreadextendsThread{@Overridepublicvoidrun(){System.out.println("线程运行中:"+Thread.currentThread().getName());//线程要执行的代码......
  • Java-类与对象
    一、面向对象在了解类与对象前,我们需要先知道"面向对象"这个词的概念:在Java语言中,我们的主要思想就是"面向对象",而在之前我们所学习的C语言中大部分时候的思想是"面向过程"。那么什么是"面向对象",什么是"面向过程"呢?在之前我们学习C语言,想要实现一个操作时,里面可能会有很多......
  • java_day14_HashSet、TreeSet、增强for循环、Map、HashMap、TreeMap、可变参数
    一、HashSetSet:HashSet:底层数据结构是哈希表,查找速度快,且元素唯一HashSet中的add方法实际上调用的是HashMap中的put方法底层和元素的hashCode方法值有关我们发现,底层判断待插入的元素是否已经存在哈希表中的方式是:将待插入的元素的哈希值与已经存......
  • JAVA基础知识补漏
    变量类型1.类变量:static2.实例变量:需要new3.局部变量:必须初始化常量final一般用大写表示命名规范所有变量、方法、类名:见名知意类成员变量:首字母小写和驼峰原则:monthSalary局部变量:首字母小写和驼峰原则常量:大写字母和下划线:MAX_VALUE类名:首字母大写和驼峰原则......
  • SpringBoot健康检查机制讲解与实现
    目录前言什么是SpringBoot健康检查如何实现SpringBoot健康检查通过官方模块SpringBootActuator什么是SpringBootActuator快速入门SpringBootActuator引入依赖添加.yml文件配置运行项目访问健康检查地址重要端点解析/health端点注意/loggers端点/info......
  • Java中JDK8-17新特性的学习上
    JDK8-17新特性(第一部分)目录JDK8-17新特性(第一部分)Lambda表达式新的时间/日期API的使用optional类的使用接口增强Lambda表达式Lambda表达式是JDK1.8之后的一种语法,是一个匿名函数,是对匿名函数的简写形式,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行......
  • 抖音小红书AI真人美女套图,如何变现?来看详细玩法!(附教程)
    介绍前两天给大家出了一个真人美女写真类的玩法,结合网盘拉新,有的小伙伴已经开始变现有收益了。今天给大家把玩法再升级一下,首先确保AI生成的人物一致,其次变现的方式也更多。先看两组图片吧这类的内容如果我不说,你是不是以为都是真人呢?因为这个账号,不管人物是什么......
  • 2024年软件设计师中级(软考中级)详细笔记【6】结构化开发方法(分值3~4)
    目录前言6.1系统分析与设计概述6.1.2系统设计的基本原理6.1.3系统总体结构设计6.1.4系统文档6.2.2数据流图6.2.3数据字典(DD)6.5用户界面设计6.5.1用户界面设计的黄金原则杂题习题:结语前言在备考软件设计师中级考试的过程中,我遇到了些许挑战,也收获了宝贵的......
  • JavaScript从零学起 —— 数据类型(进阶篇2)
    说明:此文章用作个人学习记录,若有任何问题或建议欢迎大家在评论区讨论文章目录前言一、Boolean(布尔值)1.定义2.实现3.用法示例4.常见问题与解决方法二、Undefined(未定义)1.定义2.实现3.常见问题与解决方法三、Null(空值)1.定义2.实现3.用法示例4.常见问题与......