每天一个面试题:悲观锁、乐观锁,对比Hashtable和concurrentHashMap

news2024/11/24 14:40:38

每天一个面试题:

  • 悲观锁、乐观锁
  • Hashtable和concurrentHashMap
  • 总结

开始全新的学习,沉淀才会有产出,一步一脚印!
面试题系列搞起来,这个专栏并非单纯的八股文,我会在技术的基础上,Debug解析,还会做一些实例的实现,实现一些简单的Demo,或者用于我做过的项目中去;
代码会同步在我的gitee中去,觉得不错的同学记得一键三连求关注,感谢:
链接: CasAndSync

12.11 忌收纳
混乱是自由,令人畏惧的自由

悲观锁、乐观锁

  • 悲观锁
  1. 核心代表:就是锁机制:Synchronized和Lock锁
  2. 核心思想:只有占有了锁,才可去操作资源,否则就阻塞等待
  3. 过程:就是 运行-阻塞-唤醒 ,涉及到了上下文切换,如果频繁切换,对性能影响大
  4. 细节:实际上,线程在获取锁时,如果锁已经被占用,都会做几次重试操作,减少阻塞机会
  • 乐观锁
  1. 核心代表:AtomicInteger,通过CAS保证原子性
  2. 核心思想:无需加锁,每次只有一个线程可以成功修改共享变量,其它失败的线程不需要停止,不断重试直至成功;
  3. 过程:不会阻塞,一直运行
  4. 细节:需要多核CPU支持吗,线程数不超过CPU数
public class TsetCasAndSync {

    //为了实现原子性,U的操作都是原子的
    static final Unsafe U = Unsafe.getUnsafe();
    //表示偏移量:对于Account类和balance属性
    static final long BALANCE = U.objectFieldOffset(Account.class, "balance");

 
    static class Account{
    //volatile 保证可见性
        volatile int balance = 10;
    }

上面是为了保证操作这个资源是可以访问其序列号/偏移量的

    public static void main(String[] args) {
        Account account = new Account();
        while(true){
            int o = account.balance;
            int n = o+5;
            //调用
            if (U.compareAndSetInt(account, BALANCE,o,n)){
                break;
            }
        }
        while(true){
            int o = account.balance;
            int n = o-5;
            //调用
            if (U.compareAndSetInt(account, BALANCE,o,n)){
                break;
            }
        }
    }

}

这个针对了当前情况(U.compareAndSetInt(account, BALANCE,o,n)
o:当前变量
n:操作之后的变量
account:我们操作的资源

如果我们线程A操作account,到 if (U.compareAndSetInt(account, BALANCE,o,n)){ break; },如果balance被修改,那么当前线程会对比 account和o是否相同,不同就重新在来;

public class TsetCasAndSync {

    public static void sync(Account account){
        new Thread(()->{
            synchronized (account) {
                int old = account.balance;
                int n = old - 5;
                account.balance = n;
            }
        }).start();

        new Thread(()->{
            synchronized (account){
                int old = account.balance;
                int n = old + 5;
                account.balance = n;
            }

        }).start();
    }
    static class Account{
        volatile int balance = 10;
    }

    public static void main(String[] args) {
        Account account = new Account();
			sync(account );
    }

}

锁机制,占用无法被修改

Hashtable和concurrentHashMap

  1. 都是线程安全的Map集合
  2. Hashtable并发度低,全局使用一把锁,同一时刻,只有一个线程可以操控它
  3. 1.8之前ConcurrentHashMap使用了Segment+数组+链表的结构,每个Segment对应一把锁,支持多线程操作
  4. 1.8之后ConcurrentHashMap将数组的每个头结点作为锁,如果多个线程访问的头结点不同,就不会冲突

总结

在这里插入图片描述

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

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

相关文章

戴维南定理(Thevenin‘s theorem)

戴维南定理:含独立电源的线性电阻单口网络N,就端口特性而言,可以等效为一个电压源和电阻串联的单口网络。电压源的电压等于单口网络在负载开路时的电压uoc;电阻R0是单口网络内全部独立电源为零值时所得单口网络N0的等效电阻。 例子…

JavaScript基本语法

1.JavaScript词法结构 所谓词法结构是指一套基础性规则,用来描述如何使用这门语言来编写程序,包括如下几项: 字符集unicode 区分大小写 (true和TRUE) 忽略空白字符(空格、制表符和换行符&#xff09…

UG鼠标和键盘操作

UG鼠标和键盘操作角色操作鼠标操作选择放大/缩小旋转平移确认适合窗口正视于X/Y/Z视图显示样式九宫图设置键盘操作ESCF8角色操作 角色包含了用户的自定义配置,包括内容、演示、快捷键、工具栏等,通过:菜单-首选项-用户界面-角色 进行导入导出…

【C语言程序设计】实验 8

目录 1. 整数排序 2. 二维数组按每行数据之和升序 3. 字符串排序 4. 二维数组各行元素之和 5. 二位整数数组交换两行 6. 插入排序 7. 10进制转2进制&#xff0c;8进制和16进制数&#xff08;数组&#xff09; 1. 整数排序 【问题描述】从键盘输入n(0<n<21)个整…

微服务同时接入多个Kafka

准备工作 自己搭建一个Kafka 从官方下载Kafka&#xff0c;选择对应Spring Boot 的版本&#xff0c;好在Kafka支持的版本范围比较广&#xff0c;当前最新版本是3.2.1,支持2.12-3.2.1 范围的版本&#xff0c;覆盖了Spring Boot 2.0x-Spring Boot 3.0.x。Apache Kafka 解压安装 …

CMake中target_compile_definitions的使用

CMake中的target_compile_definitions命令用于向target添加编译定义&#xff0c;其格式如下&#xff1a; target_compile_definitions(<target><INTERFACE|PUBLIC|PRIVATE> [items1...][<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) 指定在编译给定的<…

网络原理初识

网络原理初识 文章目录网络原理初识网络发展历程独立模式网络互联IP地址端口号网络协议OSI七层TCP/ IP协议封装与分用封装一.应用层二.传输层三.网络层四.数据链路层五.物理层分用六.物理层七.数据链路层八.网络层九.传输层十.应用层网络发展历程 独立模式 一开始电脑之间是相…

【InnoDB ClusterSet】快速部署

快速部署 InnoDB ClusterSet 文章目录快速部署 InnoDB ClusterSet前言前期准备架构设计部署过程1. 使用配置账号通过 MySQL Shell 连接到 InnoDB Cluster 任一成员2. 为主 InnoDB Cluster 实例设置变量3. 创建以当前集群作为主集群的 ClusterSet4. 为每个独立服务器实例添加配置…

382. 链表随机节点-哈希表法

382. 链表随机节点-哈希表法 给你一个单链表&#xff0c;随机选择链表的一个节点&#xff0c;并返回相应的节点值。每个节点 被选中的概率一样 。 实现 Solution 类&#xff1a; Solution(ListNode head) 使用整数数组初始化对象。 int getRandom() 从链表中随机选择一个节点…

Vue Element动态生成的表单如何用 el-form 校验

<el-form :model"dynamicValidateForm" ref"dynamicValidateForm" label-width"100px" class"demo-dynamic"><el-form-item prop"email" label"邮箱" :rules"[{ required: true, message: 请输入…

研究良久,终于发现了他代码写的快且bug少的原因

前言 读者诸君&#xff0c;今日我们适当放松一下&#xff0c;不钻研枯燥的知识和源码&#xff0c;分享一套高效的摸鱼绝活。 我有一位程序员朋友&#xff0c;当时在一个团队中开发Android应用&#xff0c;历经多次考核后发现&#xff1a; 在组内以及与iOS团队的对比中: 他的任…

java项目请求url存在特殊字符 400错误

java项目请求url特殊字符 400错误 1 现象 请求路径带特殊字符&#xff0c;就会400错误&#xff0c;这就泄露了服务器版本和报错信息&#xff0c;无疑是敏感信息泄露&#xff0c;实属安全漏洞。 补充项目环境&#xff1a;springmvc、tomcat 8.5.59 2 原因 经排查和报错信息…

STM32--ADC模数转换器

学习江科大自化协stm32教程记录的笔记 ADC模数转换器 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 DAC是数字-模拟转换器&#xff0c;但是P…

AI 助你轻松剪视频 # AutoCut

如果你还在犯愁每次剪视频都要反复听才能下手&#xff0c;不妨试试AutoCut , AI 大神李沐开源的一个剪辑神器&#xff0c;使用 Python 开发&#xff0c;它可以通过字幕来剪切视频。AutoCut 对你的视频自动生成字幕。然后你选择需要保留的句子&#xff0c;AutoCut 将对你视频中对…

C语言:变量的深入理解

文章目录一.什么是变量C语言中为什么要有类型&#xff1f;C语言中的类型为什么有这么多种呢&#xff1f;定义变量的本质为什么需要定义变量定义变量的本质定义变量时的规则二.深刻理解signed/unsigned定义的变量1.运算时的符号位2.数据的存储情况3.unsigned定义时的小细节三.大…

Android 13 VTS HIDL interface 解析

Android 13 VTS Introduction Android 13已经发布&#xff0c;VTS testcase发生很多变化&#xff0c;在此博客中对其每个测试项目进行流程介绍。 这里先对VTS 做一个介绍&#xff1a; VTS是vendor test suite简称&#xff0c;意为供应商测试套件。目的是确保Vendor层实现的兼容…

Spring Boot自动装配原理

Spring Boot自动装配原理1.Spring Boot 入口2.SpringBootApplicationSpringBootConfigurationComponentScanEnableAutoConfiguration判断自动装配开关是否打开获取EnableAutoConfiguration注解中的 exclude 和 excludeName获取需要自动装配的所有配置类最后3.总结1.Spring Boot…

Github访问量过百万!阿里内部至尊级分布式事务手册,实至名归

分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单的说&#xff0c;就是一次大的操作由不同的小操作组成&#xff0c;这些小的操作分布在不同的服务器上&#xff0c;且属于不同的应用&#xff0c;分布式…

[附源码]JAVA毕业设计养生药膳推荐系统(系统+LW)

[附源码]JAVA毕业设计养生药膳推荐系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

[LeetCode周赛复盘] 第 323 场周赛20221211

[LeetCode周赛复盘] 第 323 场周赛20221211 一、本周周赛总结二、 [Easy] 6257. 删除每行中的最大值1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6258. 数组中最长的方波1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6259. 设计内存分配器1. 题目描述2. 思路分析3. 代码…