当前位置: 首页 > news >正文

【面试题】公平锁和非公平锁/可重入锁

  • 1. 公平锁和非公平锁
    • 1.1 是什么
    • 1.2 两者区别
  • 2. 可重入锁(递归锁)
    • 2.1 可重入锁有哪些
    • 2.2 可重入锁作用
    • 2.3 可重入锁demo --synchronized
    • 2.4 可重入锁demo --ReentrantLock

1. 公平锁和非公平锁

1.1 是什么

公平锁:
多个线程按着申请锁的顺序来获取锁(类似排队,先来后到)。
非公平锁:
多个线程并非按着申请锁的顺序来获取锁,有可能后申请的线程更早获得锁,有可能会造成优先级反转。

1.2 两者区别

公平锁,在并发环境中,每个线程获取锁的时候会优先查询此锁维护的等待队列,如果为空或者自己是等待队列的第一个直接占有锁,否则加入等待队列。
非公平锁,上来就尝试占有锁,如果尝试失败,再采用类似公平锁的方式。

2. 可重入锁(递归锁)

同一线程,在外层方法获取锁后,内层方法自动获取锁。也就是说,线程可以进入任何一个他已经拥有锁同步的方法。

public synchronized void  method1(){
   method2();
}
public synchronized void  method2(){

}

2.1 可重入锁有哪些

ReentrantLock/synchronized

2.2 可重入锁作用

避免死锁。

2.3 可重入锁demo --synchronized

class Phone {
    synchronized void  sendSMS(){
        System.out.println(Thread.currentThread().getName()+"---sendSMS");
        sendEmail();
    }
    synchronized void sendEmail(){
        System.out.println(Thread.currentThread().getName()+"---sendEmail");
    }
}
public class TestArrayList {

    public static void main(String[] args) {
        Phone phone = new Phone();

        new Thread(()->{
            phone.sendSMS();
        },"t1").start();

        new Thread(()->{
            phone.sendSMS();
        },"t2").start();
    }
}

在这里插入图片描述

2.4 可重入锁demo --ReentrantLock

class Phone implements Runnable {

    Lock lock = new ReentrantLock();

    @Override
    public void run() {
        method1();
    }

    void method1() {
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + "--method1--lock");
            method2();
        } finally {
            lock.unlock();
            System.out.println(Thread.currentThread().getName() + "--method1--unlock");
        }
    }

    void method2() {
        lock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + "--method2--lock");
        } finally {
            lock.unlock();
            System.out.println(Thread.currentThread().getName() + "--method2--unlock");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Phone phone = new Phone();
        Thread t1 = new Thread(phone, "t1");
        Thread t2 = new Thread(phone, "t2");
        t1.start();
        t2.start();
    }
}

在这里插入图片描述

相关文章:

  • 【字体转换】快速实现繁简字体相互转换
  • Jeecg Online代码生成器--单表代码生成
  • 获取一个实时走动的时间
  • 现货黄金的收益怎么样
  • BLE广播事件包解析空口事例
  • 入行数据分析要知道什么是正态分布和其他变量分布
  • 【web-攻击本地编译性应用程序】(11.3)格式化字符串漏洞
  • 安装redis过程中make报错
  • 商城模板_商城模板网站html5_微信小程序商城模板
  • springboot基于VUE框架的商城综合项目设计与实现毕业设计源码111612
  • java.net.UnknownHostException: home
  • 高等数学(第七版)同济大学 习题6-3 个人解答
  • RTC调试
  • 多线程如何使用MDC传递上下文信息
  • HAproxy+Nginx7层负载均衡
  • 「译」Node.js Streams 基础
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【知识碎片】第三方登录弹窗效果
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • gops —— Go 程序诊断分析工具
  • java正则表式的使用
  • Promise面试题2实现异步串行执行
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 高程读书笔记 第六章 面向对象程序设计
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 七牛云假注销小指南
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 数据仓库的几种建模方法
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​secrets --- 生成管理密码的安全随机数​
  • (13)Hive调优——动态分区导致的小文件问题
  • (5)STL算法之复制
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (第27天)Oracle 数据泵转换分区表
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)认识微服务
  • .NET 8.0 发布到 IIS
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • .考试倒计时43天!来提分啦!
  • /etc/shadow字段详解
  • @AliasFor注解
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @vue/cli 3.x+引入jQuery
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [ NOI 2001 ] 食物链
  • [].slice.call()将类数组转化为真正的数组
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)
  • [C/C++]数据结构 深入挖掘环形链表问题