多线程中的公平锁、非公平锁、可重入锁、死锁【详细总结】

news2024/10/7 12:24:10

目录

  • 公平锁
  • 非公平锁
  • 公平锁和非公平锁的用法
  • 可重入锁
    • synchronized可重入锁示例
    • ReentrantLock的示例代码
  • 死锁
    • 死锁产生的原因
    • 常用解决死锁的方法
    • 判断程序是否发生死锁
    • 死锁的案例(面试会问)

公平锁

多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远是队列的第一位获得锁。效率相对低 ,但是cpu 的利用高了

非公平锁

多个线程去获得锁的时候,会直接尝试获取,如果获取不到再去进入队列等待队列,如果获得锁就直接获得了。效率高,但是线程容易饿死(所有的工作,由一个线程完成)

公平锁和非公平锁的用法

在创建可重入锁时,想构造器中传入true

private final ReentrantLock lock = new ReentrantLock(true);

为什么可以这样子创建,大家一起看一下ReentrantLock的源码

// 在没有传入参数时,默认创建一个非公平锁
public ReentrantLock() {
    sync = new NonfairSync();
}
// 当传入一个true值时,为公平锁
public ReentrantLock(boolean fair) {
    sync = fair ? new FairSync() : new NonfairSync();
}

可重入锁

指的是以线程为单位,当一个线程获得对象锁之后这个线程可以再次获取本对象锁,而其他线程是不可以的。synchronized和ReentrantLock都是可重入锁。

  • sychronized是隐式锁,不用手工上锁与解锁,而lock为显示锁,需要手工上锁与解锁
  • 可重入锁也叫递归锁

synchronized可重入锁示例

/**
 * 演示可重入锁是什么意思,可重入,就是可以重复获取相同的锁而不会出现死锁
 * synchronized和ReentrantLock都是可重入的
 * */
public class WhatReentrantSynchronized {
    // 创建一个锁对象
    static Object mylock = new Object();
    public static void main(String[] args) {
        new Thread(()->{
            // 创建第一个锁
            synchronized (mylock){
                System.out.println("这是第一层锁");
                synchronized (mylock){
                    System.out.println("这是第二层锁");
                }
            }
        }).start();
    }
}

ReentrantLock的示例代码

/**
 * lock和unlock的数量必须一致,否则会出现死锁
 * */
public class WhatReentrantLock {
    public static void main(String[] args) {
        ReentrantLock lock = new ReentrantLock();
        new Thread(()->{
            // 上锁
            lock.lock();
            try {
                System.out.println("这是第一层锁");
                // 再次上锁
                lock.lock();
                try{
                    System.out.println("这是第二层锁");
                }finally {
                    lock.unlock();
                }
            }finally {
                lock.unlock();
            }
        }).start();
    }
}

死锁

死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。

当多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进,这种情况就是死锁。

很显然,如果没有外力的作用,那么死锁涉及到的各个进程都将永远处于封锁状态。

请添加图片描述

死锁产生的原因

  • 系统资源不足
  • 系统资源分配不当
  • 进程运行顺序不当

常用解决死锁的方法

  • 如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。

  • 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率。

  • 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率。

  • 如果业务处理不好,可以用分布式事务锁或者使用乐观锁。

判断程序是否发生死锁

  • jps 类似于linux中的 ps -ef查看进程号
  • jstack 自带的堆栈跟踪工具

死锁的案例(面试会问)

public class DeadLock {
 
    //创建两个对象
    static Object a = new Object();
    static Object b = new Object();
 
    public static void main(String[] args) {
        new Thread(()->{
            // 获取a这把锁
            synchronized (a) {
                System.out.println(Thread.currentThread().getName()+" 持有锁a,试图获取锁b");
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (b) {
                    System.out.println(Thread.currentThread().getName()+" 获取锁b");
                }
            }
        },"A").start();
 
        new Thread(()->{
            // 获取b这把锁
            synchronized (b) {
                System.out.println(Thread.currentThread().getName()+" 持有锁b,试图获取锁a");
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (a) {
                    System.out.println(Thread.currentThread().getName()+" 获取锁a");
                }
            }
        },"B").start();
    }
}

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

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

相关文章

第十六章 Dijkstra算法的讲解以及证明(与众不同的通俗证明)

第十六章 Dijsktra算法的讲解以及粗略证明一、Dijkstra的用途二、Dijkstra的思想及证明(1)相关结论及证明:结论1:必须借助中间点时某个点到终点的最短路程=该点到中间点的最短距离+中间点到终点的最短距离结…

数据分析思维(一)|信度与效度思维

信度与效度思维 1、概念 信度与效度思维通常用于在数据分析中进行更有价值的指标选择。 信度:指标的可靠程度。包括一致性及稳定性。(口径是否一致,是否具有波动性) 效度:指标的有效性。一个数据或指标的生成&…

JavaFX项目打包成可安装exe文件

开发环境&#xff1a;Windows 10 2H JDK&#xff1a;jdk1.8.0_112 IDEA&#xff1a;2020.3 1. 项目中导入插件依赖 <plugin><groupId>io.github.fvarrui</groupId><artifactId>javapackager</artifactId><version>1.6.6</version>&…

[附源码]计算机毕业设计JAVA婴幼儿玩具共享租售平台

[附源码]计算机毕业设计JAVA婴幼儿玩具共享租售平台 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM …

Java学习之多态一

目录 一、入门案例 Food类 Animal类 Master类 运行测试 分析 运行结果 问题总结 二、方法的多态 三、对象的多态&#xff08;重难点/核心&#xff09; 四个非常重要的知识点&#xff08;背诵&#xff09; 举例说明 父类-Animal类 子类-Dog类 子类-Cat类 运行-Po…

如何将数据库从 CloudKit 迁移到 Firebase

为什么要迁移 如果该服务仅支持 Apple 设备,则使用 CloudKit 和 CoreData 可能是最佳选择。但是,如果您还需要支持 Web 和 Android,情况就不同了。 当同时支持Web和Android时,可以使用CloudKit JS访问iCloud DB。但是实施起来比较困难,需要有苹果账号。 如果未来有同时支…

【滤波跟踪】基于北方苍鹰和粒子群算法优化粒子滤波器实现目标滤波跟踪附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

[nacos]nacos2.x+nginx集群搭建以及过程中遇到的坑

参考文档 nacos官方集群部署说明centos7安装并配置jdknacos2.x集群实现centos7安装mysql8使用nginx反代nacos报错 badrequest 400 环境准备 vmware虚拟机上跑的centos7 (原本内存2g 坑点之一!2g内存无法启动三台nacos集群,官方说明需要4g)centos7安装并配置jdk8 安装教程参考 …

Mongoose【node.js的优雅mongodb对象建模】

Mongoose基础运行流程&#xff1a; 文章目录Mongoose基础运行流程&#xff1a;官方 Docs 地址1. 安装&#xff1a;2. 使用&#xff1a;2.1 目录结构&#xff1a;2.2 初始化连接实例 [ 创建 DBHelper.js ]2.2.1 链接地址书写格式[ mongoose.connect&#xff08;参数格式 &#x…

java计算机毕业设计ssm网络相册设计sepo8(附源码、数据库)

java计算机毕业设计ssm网络相册设计sepo8&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

机器学习笔记之受限玻尔兹曼机(四)推断任务——边缘概率

机器学习笔记之受限玻尔兹曼机——推断任务[边缘概率]引言回顾&#xff1a;场景构建推断任务——边缘概率求解边缘概率与Softplus函数引言 上一节介绍了受限玻尔兹曼机中随机变量节点的后验概率&#xff0c;本节将介绍随机变量结点的边缘概率。 回顾&#xff1a;场景构建 已…

木聚糖-氨基|Xylan-NH2|木聚糖-聚乙二醇-氨基|氨基-PEG-木聚糖

木聚糖-氨基|Xylan-NH2|木聚糖-聚乙二醇-氨基|氨基-PEG-木聚糖 Xylan-NH2 木聚糖-氨基 中文名称&#xff1a;木聚糖-氨基 英文名称&#xff1a;Xylan-NH2 别称&#xff1a;氨基修饰木聚糖&#xff0c;氨基-木聚糖 PEG分子量可选&#xff1a;350、550、750、1k、2k、34k、5…

统计学-双变量相关分析-相关系数、相关比、克莱姆相关系数

双变量相关分析根据变量的数据类型不同而不同。当数值数据和数值数据计算相关性时&#xff0c;指标为相关系数&#xff1b;数值数据和类别数据计算相关性时&#xff0c;指标为相关比&#xff1b;类别数据和类别数据计算相关性时&#xff0c;指标为克里姆相关系数。 1 计算公式…

基于现代深度学习的目标检测方法综述

论文地址&#xff1a;A Survey of Modern Deep Learning based Object Detection Models 论文结构&#xff1a; 一、论文亮点&#xff08;与其他综述不同&#xff09;&#xff1a; 1、深度分析了两类检测方法&#xff1a;单步和两步检测&#xff0c;并从历史的角度分析&…

【covid 时间序列】基于matlab GUI冠状病毒病例、死亡、疫苗接种仿真【含Matlab源码 2262期】

一、⛄SEIR模型简介 1 SEIR模型简介 如果所研究的传染病有一定的潜伏期&#xff0c;与病人接触过的健康人并不马上患病&#xff0c;而是成为病原体的携带者&#xff0c;归入 E 类。此时有&#xff1a; 仍有守恒关系 S(t) E(t) I(t) R(t) 常数&#xff0c;病死者可归入 R…

Vue3 快速入门及巩固基础

1. Vue 框架介绍 2. Vue3 安装方式 3. Vue3 模板语法 4. 组件的 data 属性 5. 计算属性和方法 6. 侦听器的使用 7. class 类名绑定对象 8. class 类名绑定数组 9. style 样式绑定对象 10. style 样式绑定数组 11. 条件渲染 v-if 和 v-show 12. 列表渲染 v-for 13. …

1,2-二苯基-1,2-二(4-苄溴基苯基)乙烯;TPE-MB结构式

中文名称:1,2-二苯基-1,2-二(4-苄溴基苯基)乙烯 中文同义词:1,2-双(4-(溴甲基)苯基)-1,2-二苯乙烯; 分子式:C28H22Br2 分子量:518.28 CAS&#xff1a;1053241-67-0 1,2-二苯基-1,2-二(4-苄溴基苯基)乙烯化学性质 沸点 &#xff1a;533.545.0 C(Predicted) 密度 &#xff…

医依通小程序项目总结

一、项目介绍&#xff1a; 这是一个医疗类的小程序&#xff0c;主要用于新冠疫苗预约&#xff0c;HPV疫苗预约&#xff0c;核酸预约&#xff0c;和咨询等&#xff0c;主要作用就是方便快捷&#xff0c;可以在手机上进行预约挂号&#xff0c;和一些健康自测的功能&#xff0c;还…

MySQL的零拷贝技术

1.需要了解Buffer 与 cache 的区别 Bbuffer 与 Cache 非常类似&#xff0c;因为它们都用于存储数据数据&#xff0c;被应用层读取字节数据。在很多场合它们有着相同的概念: 首先从翻译上&#xff0c;Buffer应该翻译为“缓冲”&#xff0c;Cache应该翻译为“缓存”&#xff0c…

高企技术企业对企业的作用

高新技术企业认定的作用 1、促进企业科技转型 创新是企业发展的根本动力&#xff0c;高新技术企业认定政策是一项引导政策&#xff0c;目的是引导企业调整产业结构&#xff0c;走自主创新、持续创新的发展道路&#xff0c;激发企业自主创新的热情&#xff0c;提高科技创新能力…