对锁的理解

news2024/11/27 10:24:09

悲观锁和乐观锁

每次操作的时候都在上锁解锁,能解决并发中的各种问题,不支持并发操作,效率低

 每次操作都加上版本号,操作提交的时候会比较数据库版本和目前的版本号是否一致,不一致就会提交失败

表锁和行锁

表锁是对整张表进行上锁,其他人则不可以再操作整张表

行锁是对某一行进行上锁,别人还可以操作其他的行,行锁会发生死锁

读锁和写锁

 读锁 也叫共享锁 会发生死锁问题

写锁 也叫独占锁 会发生死锁问题

  先来看例子,不加读写锁

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

public class Test {
    public static void main(String[] args) {
        MyCache myCache = new MyCache();
        //写操作
        new Thread(()->{
            for (int i = 1; i <= 5; i++) {
                myCache.put(i,i);
            }
        }, "0").start();
        //读操作
        new Thread(()->{
            for (int i = 1; i <= 5; i++) {
                myCache.get(i);
            }
        },"1").start();

    }
}

class MyCache{
    private volatile Map<Integer, Integer> map = new HashMap<>(5);

    public void put(Integer key, Integer value){
        System.out.println(Thread.currentThread().getName()+"正在写操作"+key);
        try {
            TimeUnit.MICROSECONDS.sleep(300);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        map.put(key,value);
        System.out.println(Thread.currentThread().getName()+"写完了"+key);
    }
    public Integer get(Integer key){
        System.out.println(Thread.currentThread().getName()+"正在读操作"+key);
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        Integer i = map.get(key);
        System.out.println(Thread.currentThread().getName()+"读完了"+i);
        return i;
    }

}

 添加读写锁之后

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class Test {
    public static void main(String[] args) {
        MyCache myCache = new MyCache();
        //写操作
        new Thread(()->{
            for (int i = 1; i <= 5; i++) {
                myCache.put(i,i);
            }
        }, "0").start();
        //读操作
        new Thread(()->{
            for (int i = 1; i <= 5; i++) {
                myCache.get(i);
            }
        },"1").start();

    }
}

class MyCache{
    private volatile Map<Integer, Integer> map = new HashMap<>(5);

    //创建读写锁
    private ReadWriteLock rwLock = new ReentrantReadWriteLock();
    public void put(Integer key, Integer value){
        //添加写锁
        rwLock.writeLock().lock();
        try {
            System.out.println(Thread.currentThread().getName()+"正在写操作"+key);
            TimeUnit.MICROSECONDS.sleep(300);
            map.put(key,value);
            System.out.println(Thread.currentThread().getName()+"写完了"+key);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }finally {
            //释放写锁
            rwLock.writeLock().unlock();
        }
    }
    public Integer get(Integer key){
        //添加读锁
        rwLock.readLock().lock();
        Integer i = null;
        try {
            System.out.println(Thread.currentThread().getName()+"正在读操作"+key);
            Thread.sleep(300);
            i = map.get(key);
            System.out.println(Thread.currentThread().getName()+"读完了"+i);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }finally {
            //释放读锁
            rwLock.readLock().unlock();
        }
        return i;
    }

}

 读写锁:一个资源可以被多个读的线程访问,或者可以被一个写线程访问,但是不能同时存在读写线程,读写互斥,读读共享的

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/875644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Joint HDR Denoising and Fusion: A Real-World Mobile HDR Image Dataset

Abstract 手机已经成为我们日常生活中无处不在、不可或缺的拍照设备&#xff0c;而小光圈和传感器尺寸使得手机更容易受到噪点和过饱和的影响&#xff0c;导致动态范围(LDR)低、画质低。 因此&#xff0c;为手机开发高动态范围(HDR)成像技术至关重要。 然而&#xff0c;现有的…

SpringBean的生命周期和循环依赖

Spring循环依赖 前言 大制作来啦&#xff0c;spring源码篇&#xff0c;很早之前我就想写一系列spring源码篇了&#xff0c;正好最近总是下雨&#xff0c;不想出门&#xff0c;那就让我来带大家走进Spring源码世界吧。 阅读建议 spring源码读起来有点难度&#xff0c;需要多Deb…

性价比最高的护眼灯,护眼台灯应该怎么挑选

随着技术的发展&#xff0c;灯光早已成为每家每户都需要的东西。但是灯光不好可能会对眼睛造成伤害是很多人没有注意到的。现在随着护眼灯产品越来越多&#xff0c;市场上台灯的选择越来越多样化&#xff0c;如何选择一个对眼睛无伤害、无辐射的台灯成为许多家长首先要考虑的问…

limereport报表使用

在这里我使用报表是以报表的形式显示数据库的信息。所以首先需要准备的资料有&#xff1a;limereport源码&#xff0c;还有数据库&#xff0c;我这里使用的是qsqlite数据库。 1、下载limereport报表源码 2、运行自带的案例&#xff1a;demo_r1 3、点击 “Run Report Designer”…

RedisDesktopManager连不上redis问题解决(小白版)

常见问题就是 redis.conf配置文件 a.将port 127.0.0.1这一行注释掉 b.protected-mode保护模式改为no 这个可以看到很多博主都说了&#xff0c;相信都搜到这里来了你们都弄了&#xff0c;我就不详细说了 防火墙开放端口 我说明我自己的问题以及解决方法 1、执行telnet 虚拟…

2023年8月第1~2周大模型荟萃

2023年8月第1~2周大模型荟萃 2023.8.14版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、黑客制造了一款基于 AI 的恶意工具 FraudGPT 早先&#xff0c;有黑客制作了一个“没有道德限制”的 WormGPT 聊天机器人&#xff0c;可以自动生成…

PDF文件限制编辑怎么取消?

PDF文件设置了限制编辑&#xff0c;想要取消PDF文件的限制编辑&#xff0c;很简单&#xff0c;打开PDF编辑器&#xff0c;点击工具栏中的文件&#xff0c;选择属性按钮&#xff0c;进入到熟悉感界面之后&#xff0c;点击安全&#xff0c;然后我们点击权限下拉框&#xff0c;选择…

ModaHub魔搭社区:Milvus Cloud向量数据库可以部分避免AI幻觉

向量数据库的技术优势使其更适合在AI场景下应用&#xff0c;能够为AI的开发、增强内容生成的准确性提供重要的技术支撑。进一步来讲&#xff0c;向量数据库也被看作是大语言模型的记忆与灵魂&#xff0c;对于解决大模型的“幻觉”问题至关重要。 由于大模型是基于已有数据训练而…

TB/TM-商品详情原数据(APP)

一、接口参数说明&#xff1a; item_get_app-获得TB/TMapp商品详情原数据&#xff0c;点击更多API调试&#xff0c;请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_get_app 名称类型必须描述keyString是调用key&…

java+springboot+mysql员工管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的员工管理系统&#xff08;人力资源管理系统&#xff09;&#xff0c;系统包含超级管理员、管理员、员工角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;部门管理&#xff1b;职位管理…

嵌入式面试笔试刷题(day10)

文章目录 前言一、数组和链表的区别二、什么是内存对齐三、IIC的时序四、static作用五、查看tty设备的方法六、查找指定文件命令七、三次握手和四次挥手1.三次握手2.四次挥手 八、半关闭状态九、字节流和数据报总结 前言 本篇文章继续讲解笔试和面试。 一、数组和链表的区别 …

C++ STL stack queue

目录 一.stack 介绍 二.stack 使用 三.stack 模拟实现 普通版本&#xff1a; 适配器版本&#xff1a; 四.queue的介绍 五. queue使用 六.queue模拟实现 七.deque介绍 1.容器适配器 2.deque的简单介绍 3.deque的缺陷 4.为什么选择deque作为stack和queue的底层默认容…

SpringBoot复习:(46)全局的bean懒加载是怎么实现的?

在application.properties中配置&#xff1a; spring.main.lazy-initializationtrue在运行SpringApplication的run方法时&#xff0c;代码如下&#xff1a; 其中调用了prepareContext,prepareContext代码如下&#xff1a; 当在配置文件中配置了spring.main.lazy-initializat…

中国1990-2021连续30年土地利用数据CLCD介绍及下载

CLCD数据介绍 CLCD(China Land Cover Dataset)数据集由武汉大学黄昕老师公布,黄昕老师基于Google Earth Engine上335,709景Landsat数据,制作中国年度土地覆盖数据集(annual China Land Cover Dataset, CLCD),包含1985+1990—2020中国逐年土地覆盖信息。 为此,黄昕老师…

学好Elasticsearch系列-索引的批量操作

本文已收录至 Github&#xff0c;推荐阅读 &#x1f449; Java 随想录 先看后赞&#xff0c;养成习惯。 点赞收藏&#xff0c;人生辉煌。 文章目录 基于 mget 的批量查询基于 bulk 的批量增删改增加删除修改 filter_path Elasticsearch 提供了 _bulk API 来执行批量操作&#x…

Web APIs 第六天

正则表达式介绍语法元字符修饰符 一.正则表达式介绍 ① 简介 用来匹配字符串中字符组合的模式在JavaScript中&#xff0c;正则表达式也是对象通常用来查找&#xff0c;替换那些符合正则表达式的文本&#xff0c;许多语言都支持正则表达式 ② 使用场景 验证表单&#xff1a…

解决Adobe Flash Player已被屏蔽

问题&#xff1a;该插件不支持 原因&#xff1a;现在浏览器默认禁用flash 博主当前使用的是谷歌浏览器Chrome 2个主要方法都已经失效 搜索一圈后&#xff0c;之前博客给出的2个主要方法都已经失效。 1、flash.cn 下载本地播放器 2、在chrome中打开flash的禁用开关 2023年解…

vm ubuntu20共享文件夹

问题: 根据教程开启共享文件夹后 ,在ubuntu 的/mnt里面没有hgfs目录,也没有共享的两个文件夹,执行如上命令可重新挂载共享目录 vmware-hgfsclient sudo vmhgfs-fuse .host:/ /mnt/ -o nonempty -o allow_other 之后通过find / -name 你的共享目录名字 查看是否加载成功 附…

总线基本概念

总线基本概念 为什么要用总线 总线是连接各个部件的信息传输线&#xff0c;是各个部件共享的传输介质。&#xff08;如果没有总线&#xff0c;那么每新增一个组件&#xff0c;就需要增加若干线和其余组件相连&#xff09; 在任何一个时刻&#xff0c;只能有一对设备&#xf…

第三章 图论 No.12欧拉回路与欧拉路径

文章目录 定义欧拉路径的性质&#xff1a;1123. 铲雪车边编号输出欧拉路径&#xff1a;1184. 欧拉回路点编号字典序最小输出欧拉路径&#xff1a;1124. 骑马修栅栏并查集判断有向图是否存在欧拉路径&#xff1a;1185. 单词游戏 定义 小学一笔画问题&#xff0c;每条边只经过一次…