线程安全(有点乱哈)

1.多个进程访问共享资源,通过上锁保证数据安全

1.2锁的宏观分类方式是悲观锁和乐观锁

1.3悲观锁和乐观锁

悲观锁:拿数据上锁‘

举例:synchronzied

乐观锁:每次拿数据的时候不会上锁,更新数据,比较下版本号’cas(一种缩写,一个方法,好像叫做compareandswap)

cas:compare and swap 即比较并替换

1.4锁相关的概念

2.synchronzied

悲观锁,一种同步锁

修饰代码块

修饰方法

修饰一个静态的方法   锁标识对象就是当前类字节码对象

this锁表示对象,多个线程要抢同一把锁,那么锁标识必须是同一个。

除了静态方法锁的是字节码对象,其余都是锁的this,锁标识对象。

2.1sysconnized原理

同步方法:vm使用ACC_SYNCHRONZIED标识实现,有标识,尝试获取monitor,然后执行方法,执行结束释放montor锁

同步代码块:monitoreter和monitoreit实现同步,monitoreter会获取对应的monitor

moniter有一个记录次数计数器,

退出,再自减,减到0别的线程就可以获取、

自己再获得+1

sys锁机制,1.5以前,通过cas指令,默认sys是重量级锁,1.6以后,对锁进行了升级,sys锁优化。

用户态:操作系统提供的一些api

内核态:cpu指令

同步方法和同步代码块过monitoreter实现

每个monitor都有一个对象

每一个锁标识对象都在堆里面有一个对象

对象头里有一个mark word 标识是轻量级锁还是重量级锁,指向结构体。

通过cas机制,判断_owner,为空,owner就是当前线程

count就是重复获取的次数,再次获取同一个线程

waitset 处于wait线程队列

entrylist:阻塞等待的线程

从entrylist中获取锁,获取到锁,owner变为抢到线程的id

释放锁:等着count减为0,释放锁,当count为0则将owner设置为null

2.2   1.6 以后锁的优化

锁清除:锁消除即删除不必要的加锁操作。根据代码逃逸技术,如果判断到一段代码中,堆上的数据不会逃逸出当前线程,那么可以认为这段代码是线程安全的,不必要加锁。

锁粗化

把锁扩大,不用每个都加,将连续的锁扩大为更大的锁。

锁的升级和降级

偏向锁:使cas记录获取它的线程,一个线程获取时,避免用户态转内核态

轻量级锁:是由偏向锁升级来的,第二个没有抢到就自旋等待(10ms以后尝试获取锁),某线程长时间等待,浪费资源。

重量级锁:锁竞争情况严重,由轻量级锁升级为重量级,某线程达到最大自旋次数10次,轻量级升级为重量级锁。

大部分都是在偏向锁和轻量级锁

3.线程并发库

线程并发库:比如显示锁,lock锁,juc简称,是专门java并发设计包

显示锁

需要自己显示的加锁

原子变量类(乐观锁)

为了实现原子性操作提供的原子类

线程池相关

并发容器类:concurentmap

同步工具类:倒计时门栓,countdownLatch,有个信号量

4.线程同步 lock

lock和sys的区别

它们都是悲观锁,都是jvm级别

lock是java代码实现的,api是显示锁,sys是jvm管理的,就是隐形锁

lock是显示锁,sys是内置锁

lock是一个接口,sys是一个关键字。

lock可公平可非公平

1.6之前,lock效率高于sys,1.6就差不多了。

sys可以修饰代码块,可以修饰方法。lock只能修饰代码块。

5.lock原理

先介绍,lock会用到的东西,一个unsafe类,一个AQS

unsafe类 ,不安全的操作,直接访问系统内存资源

先用反射获得,它会避免用户使用

做对内存的操作,cas操作,线程调度,这个unsafe类反正有点吊,可以阻塞线程,lock就会用到。

Lock基于AQS 

AQS也只是个框架

构建锁和同步器的框架,底层用了cas技术保证

AQS原理分析

AQS底层原理,和sys底层原理一样。

state(0表示没有占用,可以占用)   cas,尝试0设置为1,,失败就排列的等待。用park方法,放入队列,释放锁(和sys差不多),然后抢锁。

调用lock加锁的时候,用到了AQS,公平锁和非公平锁的方法

公平锁:比较尝试获取,cas了一下把计算器改为一(如果计算器等于0),成功把这个锁的当前设置为当前线程。失败,将计数器从0设置为1失败,当前持有锁的线程==当前线程,将计数器加1,如果等于,则是返回失败。、,阻塞然后放入等待队列。

释放线程:就是sys释放中大概意思,不过是用代码实现了

lock原理其实和sys原理差不多,不过sys是底层实现,lock代码实现,思路都可以说是一模一样,没有区别。

lock原理基于

7.线程安全乐观锁

是不加锁的,只是在修改的时候先做判断,有没有别人修改,atomic开头就是基于cas的乐观锁。

利用原子类

数据库通过version控制

工具类

countdownlatch(5) ,的值不为,则会一直阻塞,自己再新建个线程逻辑中减一。在分布式锁zookeeper中有用到,临时有序,每个监听前一个删除事件,删除了,就把它门栓设置为0。

信号量:多个线程竞争特定个数资源,做秒杀,限流(信号量限流)

8.TreadLocal,关于contoller变量对多并发的,太累了,就不写了。,其实还是加锁,不过这个效率高点。

它有一个map,每个线程都有一个map,

set值的话,默认是以当前作为key存入它底层的map的

存在一个内存泄漏的问题

entry是一个弱引用,有四种引用类型,强引用,软引用,和虚引用,关联到垃圾回收机制。

强引用:最常见的引用类型,只要存在,就不会被回收

软引用:内存不足时回收

弱引用:下次垃圾回收之前

虚引用:

强引入用在tl,map都被回收了,但是强引用没有被回收,这时导致内存泄漏,value成为一个永远无法被访问,无法被回收的对象。

treadloacl。声明为static final,还有remove删除掉。

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

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

相关文章

抖音机构号授权矩阵系统源码:打造自媒体帝国的新利器

在自媒体风起云涌的时代,抖音作为短视频领域的佼佼者,早已成为内容创作者们争相入驻的热门平台。然而,随着竞争加剧,如何在这场流量大战中脱颖而出,成为每一位自媒体人不得不面对的课题。今天,我们将带您深…

MySQL性能优化篇之SQL语句优化

目录 向数据库请求不需要的数据查询不需要的记录总是返回全部的列 MySQL扫描了额外的行扫描的行数和返回的行数行访问类型也要注意extra列的信息优化扫描行数过多的建议 重构查询方式一个复杂的查询还是多个简单的查询切分查询 常用的查询技巧使用内连接而不是外连接优化关联查…

防火墙一些有关知识

防火墙概述 防火墙核心任务 控制和防护 如何发挥功能 防火墙通过安全策略识别列两并做出相应动作。和ACL一样,所以防火墙本质就是ACL 防火墙分类 按物理特性划分 软件防火墙:电脑带的防火墙 硬件防火墙:设备,这个设备做的就…

深度学习之网络构建

目标 选择合适的神经网络 卷积神经网络(CNN):我们处理图片、视频一般选择CNN 循环神经网络(RNN):我们处理时序数据一般选择RNN 超参数的设置 为什么训练的模型的错误率居高不下 如何调测出最优的超参数 …

继电器实现直流电机正反转

有关继电器的使用方法,首先介绍了继电器的内部工作原理,然后介绍了两只继电器组成的正反转电路,以及用继电器实现直流电机正反转的具体方法,供大家学习参考。 继电器实现直流电机正反转 1、继电器内部原理 线圈断电时公共与常闭…

华贝甄选商业生态,成功背后的秘诀在这里

华贝甄选通过其独特的商业生态模式,不仅展示了对电子商城业务的深刻理解,更体现了对市场趋势和政策导向的敏锐把握。其S2B2C2B的用户交互模式,无疑是对传统商业模式的一次创新,它融合了供应链、企业和消费者之间的紧密联系&#x…

javaweb学习day4--《maven篇》maven的项目创建及其依赖管理详解(基于最新版本的idea)

一、前言 javaweb学习的第四天,不知道今天你们是否坚持下去了。今天学习到的是maven,温馨提示一下,idea中自带maven不用自行去下载了。前期的配置工作太过复杂了,小编感觉自己能力有限并不能将其讲的太清楚,还请大家在…

c小红的图上划分(牛客127)

题意: 有一个无向图,有 n 个点 m 条边,q 个询问,每次给出 L,R,求将图划分为至少 L 个连通块,最多 R个连通块的最大划分价值,若不可划分输出 "NO ANSWER"。 图的划分定义为将图划分为一…

如何将本地仓库中的文件推送到远程git服务器

第一步:进入所在项目,右击打开"Git Bash Here" 第二步:git config --global user.email "18351810763163.com" // 输入你的名称 第三步:git config --global user.name "chenliang-sam&quo…

如何将一个2D数组切分成多个块

要将一个2D数组切分成多个块,可以考虑使用以下几种方法,具体取决于如何定义块的划分规则和需求。如果你希望将2D数组均匀地切分成固定大小的小块,可以使用简单的循环和切片操作。 1、问题背景 Python 中, 如果有一个 raw 数据文件&#xff0…

SSM社区物业管理系统-计算机毕业设计源码91276

摘要 随着城市化进程的加快,居民社区的规模和数量不断增长,传统的人工管理方式已经无法满足管理需求。借助信息技术和互联网应用,社区物业管理系统可以实现物业管理信息的集中化、自动化和便捷化,提供全方位的管理和服务支持。社区…

智慧水利的变革之路:如何通过大数据、物联网和人工智能构建高效、智能、可持续的水利管理新模式

目录 一、引言:智慧水利的时代背景与意义 二、大数据:水利管理的数据基石 (一)数据收集与整合 (二)数据分析与挖掘 三、物联网:水利管理的感知神经 (一)智能感知与监…

ONLYOFFICE 8.1版本版本桌面编辑器测评

ONLYOFFICE官网链接:ONLYOFFICE - 企业在线办公应用软件 | ONLYOFFICE ONLYOFFICE在线办公套件:在线办公套件 | ONLYOFFICE ONLYOFFICE在线PDF编辑器、阅读器和转换器:在线PDF查看器和转换器 | ONLYOFFICE ONLYOFFICE 8.1版本桌面编辑器是…

开源可视化Flutter图表库:Graphic

Graphic:用Graphic绘制数据的无限可能- 精选真开源,释放新价值。 概览 Graphic,这个基于Flutter的图表库,以其源自《The Grammar of Graphics》的灵感,为数据可视化提供了一种全新的方法。它不仅仅是一个工具&#xf…

【Pytorch】RNN for Image Classification

文章目录 1 RNN 的定义2 RNN 输入 input, h_03 RNN 输出 output, h_n4 多层5 小试牛刀 学习参考来自 pytorch中nn.RNN()总结RNN for Image Classification(RNN图片分类–MNIST数据集)pytorch使用-nn.RNNBuilding RNNs is Fun with PyTorch and Google Colab 1 RNN 的定义 nn.…

【ECCV 2024】首个跨模态步态识别框架:Camera-LiDAR Cross-modality Gait Recognition

【ECCV 2024】首个跨模态步态识别框架:Camera-LiDAR Cross-modality Gait Recognition 简介:主要方法:实验结果: 论文:https://arxiv.org/abs/2407.02038 简介: 步态识别是一种重要的生物特征识别技术。基…

算法力扣刷题记录 四十一【N叉树遍历】

前言 依然是遍历问题。由二叉树扩展到N叉树遍历。 记录 四十一【N叉树遍历】 一、【589. N叉树的前序遍历】 题目 给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔…

第十八章 Express multer 文件上传

本章将学习Express multer 文件上传 ,因为Nest 的文件上传是基于 Express 的中间件 multer 实现的,所以在学习 Nest 文件上传之前,我们先学习下 multer 包 首先先创建 multer-test 文件夹执行下面代码 创建package.json npm init -y接着安装…

深入浅出 Spring @Async 异步编程的艺术

目录 一、异步编程 二、Async 介绍 2.1 Async 使用 三、Async 原理 一、异步编程 在软件开发中,异步编程是非常关键的,尤其是构建高性能、高响应度的应用时。异步编程的主要优势在于它能够避免阻塞操作,提高程序的效率和用户体验。异步编…

修BUG:程序包javax.servlet.http不存在

貌似昨晚上并没有成功在tomcat上面运行,而是直接运行了网页。 不知道为啥又报错这个。。。 解决方案: https://developer.baidu.com/article/details/2768022 就整了这一步就行了 而且我本地就有这个tomcat就是加进去了。 所以说啊,是不是&a…