Java多线程——synchronized、volatile 保障可见性

在这里插入图片描述

目录

  • 引出
  • synchronized、volatile 保障可见性
  • Redis冲冲冲——缓存三兄弟:缓存击穿、穿透、雪崩
    • 缓存击穿
    • 缓存穿透
    • 缓存雪崩
  • 总结

引出

Java多线程——synchronized、volatile 保障可见性


synchronized、volatile 保障可见性

  • 原子性:在一次或者多次操作时,要么所有操作都被执行,要么所有操作都不执行。
  • 可见性:当一个线程对共享变量进行修改后,另外一个线程可以立即看到该变量修改后的最新值。
  • 有序性:程序执行的顺序按照代码的先后顺序执行。

synchronized关键字和Lock相关的工具类可以保证原子性、可见性和有序性,volatile关键字可以保证可见性和有序性,不能保证原子性。

可见性:synchronize、volatile

原子性:synchronize

volatile保证数据的可见性,但是不保证原子性(多线程进行写操作,不保证线程安全);而synchronized是一种排他(互斥)的机制。

主线程无法感知t1线程修改了flag值:

private static Boolean flag = false;
public static void main(String[] args) throws Exception {Thread t1 = new Thread(()->{try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}flag = true;});t1.start();while (true) {if (flag) {System.out.println("线程修改了flag");break;}}
}

解决1:synchronized。 程序执行synchronized后,会清空工作内存副本数据,之后就从新从主内存获取数据

while (true) {synchronized (flag) { if (flag) {System.out.println("线程修改了flag");break;}}
}

某一个线程进入synchronized代码块前后,执行过程入如下:
线程获得锁
清空工作内存
从主内存拷贝共享变量最新的值到工作内存成为副本
执行代码
将修改后的副本的值刷新回主内存中
线程释放锁

解决2:volatile 也可以保证多线程之间访问共享变量时的可见性。

public class App10 {private static volatile Boolean flag = false;public static void main(String[] args) throws Exception {Thread t1 = new Thread(() -> {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}flag = true;});t1.start();while (true) {if (flag) {System.out.println("线程修改了flag");break;}}}
}

子线程t从主内存读取到数据放入其对应的工作内存
将flag的值更改为true,但是这个时候flag的值还没有写会主内存
此时main方法main方法读取到了flag的值为false
当子线程t将flag的值写回去后,失效其他线程对此变量副本
再次对flag进行操作的时候线程会从主内存读取最新的值,放入到工作内存中

总结: volatile保证不同线程对共享变量操作的可见性,也就是说一个线程修改了volatile修饰的变量,当修改写回主内存时,另外一个线程立即看到最新的值。

Redis冲冲冲——缓存三兄弟:缓存击穿、穿透、雪崩

缓存击穿

缓存击穿:redis中没有,但是数据库有

顺序:先查缓存,判断缓存是否存在;如果缓存存在,直接返回数据;如果缓存不存在,則查询数据库,将数据库的数据存入到缓存

在这里插入图片描述

解决方案:将热点数据设置过期时间长一点;针对数据库的热点访问方法上分布式锁;

缓存穿透

缓存穿透:redis中没有,数据库也没有

在这里插入图片描述

解决方案:

(1)将不存在的key,在redis设置值为null;

(2)使用布隆过滤器;

原理:https://zhuanlan.zhihu.com/p/616911933

在这里插入图片描述

布隆过滤器:

如果确认key不存在于redis中,那么就一定不存在;

它说key存在,就有可能存在,也可能不存在! (误差)

在这里插入图片描述

布隆过滤器

1、根据配置类中的 key的数量 ,误差率,计算位图数组【二维数组】

2、通过布隆过滤器存放key的时候,会计算出需要多少个hash函数,由hash函数算出多少个位图位置需要设定为1

3、查询时,根据对应的hash函数,判断对应的位置值是否都为1;如果有位置为0,则表示key一定不存在于该redis服务器中;如果全部位置都为1,则表示key可能存在于redis服务器中;

缓存雪崩

缓存雪崩:

Redis的缓存雪崩是指当Redis中大量缓存数据同时失效或者被清空时,大量的请求会直接打到数据库上,导致数据库瞬时压力过大,甚至宕机的情况。

造成缓存雪崩的原因主要有两个:

1.相同的过期时间:当Redis中大量的缓存数据设置相同的过期时间时,这些数据很可能会在同一时间点同时失效,导致大量请求直接打到数据库上。

2.缓存集中失效:当服务器重启、网络故障等因素导致Redis服务不可用,且缓存数据没有自动进行容错处理,当服务恢复时大量的数据同时被重新加载到缓存中,也会导致大量请求直接打到数据库上。

预防缓存雪崩的方法主要有以下几种:

1.设置不同的过期时间:可以将缓存数据的过期时间分散开,避免大量缓存数据在同一时间点失效。

2.使用加锁:可以将所有请求都先进行加锁操作,当某个请求去查询数据库时,如果还没有加载到缓存中,则只让单个线程去执行加载操作,其他线程等待该线程完成后再次进行判断,避免瞬间都去访问数据库从而引起雪崩。

3.提前加载预热:在系统低峰期,可以提前将部分热点数据加载到缓存中,这样可以避免在高峰期缓存数据失效时全部打到数据库上。

4.使用多级缓存:可以在Redis缓存之上再使用一层缓存,例如本地缓存等,当Redis缓存失效时,还能够从本地缓存中获取数据,避免直接打到数据库上。

在这里插入图片描述

本地缓存:ehcache oscache spring自带缓存 持久层框架的缓存


总结

Java多线程——synchronized、volatile 保障可见性

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人机生态环境监测、图像处理与GIS数据分析

构建“天空地”一体化监测体系是新形势下生态、环境、水文、农业、林业、气象等资源环境领域的重大需求,无人机生态环境监测在一体化监测体系中扮演着极其重要的角色。通过无人机航空遥感技术可以实现对地表空间要素的立体观测,获取丰富多样的地理空间数…

大数据开发-Hadoop之MapReduce

文章目录 MapReduce原理剖析MapReduce之Map阶段MapReduce之Reduce阶段WordCount分析多文件WordCount分析 实战wordCount案例开发 MapReduce原理剖析 MapReduce是一种分布式计算模型,主要用于搜索领域,解决海量数据的计算问题MapReduce由两个阶段组成:Ma…

打造高效、安全的交易平台:开发流程与关键要素解析

在数字化时代,大宗商品交易平台开发/搭建已成为连接买家与卖家的桥梁,为无数企业和个人提供了便捷、高效的交易机会。然而,随着市场的竞争日益激烈,如何打造一个既符合用户需求又具备竞争力的交易平台,成为了众多开发者…

数据处理分类、数据仓库产生原因

个人看书学习心得及日常复习思考记录,个人随笔。 数据处理分类 操作型数据处理(基础) 操作型数据处理主要完成数据的收集、整理、存储、查询和增删改操作等,主要由一般工作人员和基层管理人员完成。 联机事务处理系统&#xff…

MooC下载pdf转为ppt后去除水印方法

1、从MooC下载的课件(一般为pdf文件)可能带有水印,如下图所示: 2、将pdf版课件转为ppt后,同样带有水印,如下图所示: 3、传统从pdf中去除水印方法不通用,未找到有效去除课件pdf方法…

【开源物联网平台】FastBee使用EMQX5.0接入步骤

​🌈 个人主页:帐篷Li 🔥 系列专栏:FastBee物联网开源项目 💪🏻 专注于简单,易用,可拓展,低成本商业化的AIOT物联网解决方案 目录 一、将java内置mqtt broker切换成EMQX5…

【Web安全】SQL各类注入与绕过

【Web安全】SQL各类注入与绕过 【Web安全靶场】sqli-labs-master 1-20 BASIC-Injection 【Web安全靶场】sqli-labs-master 21-37 Advanced-Injection 【Web安全靶场】sqli-labs-master 38-53 Stacked-Injections 【Web安全靶场】sqli-labs-master 54-65 Challenges 与62关二…

新建Flutter工程修改配置

由于国内 网络环境原因, 新建 flutter工程的 配置文件 需要修改几个地方, 1. gradle-wrapper.properties 问题:Exception in thread "main" java.net.ConnectException: Connection timed out: connect: 解决方法&#…

数组常见算法

一、数组排序 冒泡排序 本篇我们介绍最基本的排序方法:冒泡排序。 实现步骤 1、比较两个相邻元素,如果第一个比第二个大,就交换位置 2、对每一对相邻元素进行同样的操作,除了最后一个元素 特点 每一轮循环后都会把最大的一个…

【STM32详解FLASH闪存编程原理与步骤】

STM32详解FLASH闪存编程原理与步骤 FLASH编程注意事项FLASH编程过程STM32的FLASH擦除过程FLASH全片擦除FLASH操作总结锁定解锁函数写操作函数擦除函数获取状态函数等待操作完成函数读FLASH特定地址数据函数 FLASH编程注意事项 1.STM32复位后,FPEC模块是被保护的&am…

【二】【SQL Server】如何运用SQL Server中查询设计器通关数据库期末查询大题

教学管理系统201703153 教学管理系统数据库展示 成绩表展示 课程表展示 学生表展示 院系表展示 一、基本操作 设置复合主键 设置其他表的主键 设置字段取值范围 二、简单操作 第一题 第二题 第三题 第四题 结尾 最后,感谢您阅读我的文章,希望这些内容能…

网工内推 | 华为成都研究所,24届应届生人才储备计划

华为成都研究所 招聘岗位 网络工程师(2024应届) 岗位要求 24届的学员 本科公办院校 英语4/6级 有HCIP优先 工作地点 成都 私信小编,回复【内推】,获取内推名额申请资格~ 想获取更多『 思科 | 华为 | 红帽 认证真题 』、『 网…

stl的基本知识学习

1.vector: 2.set: 3.map: 4.栈: 5.队列: 6. unordered_map与unordered_set: 7. 位运算: 8.cctype: 导图:

基础50刷题之一(交替合并字符串)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、题目二、力扣官方题解(双指针)三、文心一言解释总结 前言 刚上研一,有人劝我好好学C,当时用的不多就没学&a…

进制算法题(进制转换、Alice和Bob的爱恨情仇)

进制的本质 对于一个十进制数字,比如说153,其本质是每一个数位上的数字乘上这一位上的权重,即:153(1x)(5x)(3 x)而二进制,只不过是把10换成了2,任意一个非负整数都有唯一的一个二进制表示: 在计算机中,数字…

python+django+vue电影票订购系统dyvv4

电影院订票信息管理系统综合网络空间开发设计要求。目的是将电影院订票通过网络平台将传统管理方式转换为在网上操作,方便快捷、安全性高、交易规范做了保障,目标明确。电影院订票信息管理系统可以将功能划分为用户和管理员功能[10]。 语言:…

HM2019创建分析模型

步骤一:查看单元类类型(通过card edit),然后展开模型查看模型信息;步骤二:为材料集里添加新的材料 材料:Al 弹性模量E:70000 泊松比NU:0.33 其中:MAT1表示各向同性材料,E表示弹…

百度搜索引擎SEO优化方法

随着互联网的不断发展,搜索引擎已经成为人们获取信息、产品和服务的主要途径之一。而在中国,百度作为最大的搜索引擎,其影响力不可忽视。了解并掌握百度SEO关键词优化方法,对于提升网站在搜索引擎中的排名至关重要。 关键词选择&a…

Android应用开发data android:schemes标签的作用

文章目录 data android:schemesAndroidManifest.xml 中 <data> 元素的属性详解 data android:schemes 在 AndroidManifest.xml 文件中&#xff0c; 标签的作用是指定该应用可以处理的 URI 方案。 URI 是统一资源标识符&#xff0c;它是一种用于标识资源的标准方法。URI…

chrome浏览器离线安装及历史版本的下载

背景&#xff1a;测试web功能在浏览器各版本的兼容性&#xff0c;需要用到旧版本的浏览器&#xff0c;当用户环境无法访问到互联网&#xff0c;需要下载离线版本安装&#xff1b; 1、在线版本安装 需要当前环境能正常使用互联网&#xff1a; 目前能访问的官网地址&#xff1…