共享锁和排它锁

简介: 共享锁和排它锁

@[toc]

共享锁和排它锁

以 ReentranReadWriteLock 读写锁为例

什么是共享锁和排它锁

  • 排它锁,又称独占锁,独享锁 synchronized就是一个排它锁
  • 共享锁,又称为读锁,获得共享锁后,可以查看,但无法删除和修改数 据, 其他线程此时业获取到共享锁,也可以查看但是 无法修改和 删除数据
  • 共享锁和排它锁典型是ReentranReadWriteLock 其中,读锁是共享锁,写锁是 排它锁

读写锁的作用

在没有读写锁之前,我们使用的是ReentrantLock ,虽然我们保证了线程安全,,但是业浪费了一定的资源,多个读操作同时进行,是不会出现线程安全问题

读写锁的规则

  • 读写锁只是一把锁,可以通过2种方式锁定,读锁定和写锁定
  • 多个线程取请求读锁,都可以请求到的
    如果一个线程获取到了读锁,其他线程需要写锁,申请的写锁必须得等读锁释放

总结 : 要么多读,要么一写,二者不可共存

ReentranReadWriteLock 具体用法

上代码

package com.yxl.po;

import java.util.concurrent.locks.ReentrantReadWriteLock;

public class a {

    //创建读写锁
    private static ReentrantReadWriteLock reentrantReadWriteLock=new ReentrantReadWriteLock();

    //创建读锁
    private static ReentrantReadWriteLock.ReadLock readLock=reentrantReadWriteLock.readLock();
    //创建写锁
    private static ReentrantReadWriteLock.WriteLock writeLock=reentrantReadWriteLock.writeLock();

    //读锁方法
    private static void read(){
        readLock.lock();
        try {
            System.out.println(Thread.currentThread().getName()+"得到了读锁");
            Thread.sleep(1000);
        }catch (Exception e){

        }finally {
            System.out.println(Thread.currentThread().getName()+"释放读锁");
            readLock.unlock();
        }
    }

    //写锁方法
    private static void write(){
        writeLock.lock();
        try {
            System.out.println(Thread.currentThread().getName()+"得到了写锁");
            Thread.sleep(1000);
        }catch (Exception e){

        }finally {
            System.out.println(Thread.currentThread().getName()+"释放写锁");
            writeLock.unlock();
        }
    }

    public static void main(String[] args) {
        new Thread(()->read(),"T1").start();
        new Thread(()->read(),"T2").start();
        new Thread(()->write(),"T3").start();
        new Thread(()->write(),"T4").start();
    }


}

在这里插入图片描述

  • 从运行结果可以、看到 读锁 线程1 和 2 都可以一起获取到 而写锁必须得获取释放,下一个线程才能获取

读锁和写锁的交互方式

  • 插队: 不允许读锁插队
  • 升降级 允许降级,不允许升级,

是否是公平策略 ,和 ReentranLock 一样 传入true ,false

在这里插入图片描述

  • 底层设计思路和ReentranLock 一样

在这里插入图片描述

公平锁: 不允许插队
非公平锁:

  • 写锁可以随时插队
  • 读锁仅在等待队列头节点不是想获取写锁到时候可以插队
相关文章
|
3月前
|
存储 关系型数据库 MySQL
MySQL数据库锁:共享锁和独占锁
本文详细介绍了`InnoDB`存储引擎中的两种行级别锁:共享锁(S锁)与排他锁(X锁)。通过具体示例展示了这两种锁的工作机制及其在`InnoDB`与`MyISAM`引擎中的表现差异。文章还提供了锁的兼容性矩阵,帮助读者更好地理解锁之间的互斥关系。最后总结了两种锁的特点及适用场景。适合希望深入了解`MySQL`并发控制机制的读者阅读。
140 1
|
5月前
|
SQL 关系型数据库 MySQL
MySQL使用行级锁时,并非直接锁定记录,而是锁定涉及的索引。对于表`user_item`,更新语句先锁定非主键索引`idx_1`,再锁定主键索引。若两条更新语句分别按不同顺序锁定这两个索引,可能导致互相等待对方释放锁,引发死锁。解决方案包括先查询待更新记录的主键,再按主键更新,确保一致的锁定顺序。
54 2
|
5月前
|
SQL 关系型数据库 MySQL
临键锁引发的死锁
【8月更文挑战第4天】
47 0
临键锁引发的死锁
|
5月前
|
关系型数据库 MySQL 数据库
共享锁与排它锁 + 意向锁+记录锁
【8月更文挑战第3天】
59 0
|
5月前
|
数据库 SQL
间隙锁+临键锁
【8月更文挑战第1天】
55 0
|
7月前
|
SQL 关系型数据库 MySQL
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
146 0
|
8月前
|
SQL 存储 关系型数据库
MySQL 意向共享锁、意向排他锁、死锁
MySQL 意向共享锁、意向排他锁、死锁
96 0
MySQL 意向共享锁、意向排他锁、死锁
|
8月前
|
数据库 数据安全/隐私保护
什么是行级锁和表级锁
什么是行级锁和表级锁
141 0
共享锁(读锁)和排他锁(写锁)
共享锁(读锁)和排他锁(写锁)
228 0
|
SQL 关系型数据库 MySQL
一分钟了解乐观锁、悲观锁、共享锁、排它锁、行锁、表锁以及使用场景
!! 背景:最近在各种群和博客里,又看见了什么[乐观锁]、悲观锁什么鬼的感觉很高级的词汇,于是乎今天对这几个概念进行整理一下,揭开它神秘的面纱,给大家提供一个基本参考。作为开发人员不管是用什么编程语言,我觉得这些是应该要掌握的。知其然,知其所以然。 锁机制是 MySQL 中用来保证并发访问数据库时数据一致性和完整性的重要机制。在并发访问中,多个事务可能同时对同一份数据进行操作。如果不采用锁机制,就会出现数据错乱和丢失的问题。MySQL 中的锁机制主要包括以下几种类型:
343 0