【Java并发编程 线程安全】18.Java20种锁整理

白色玫瑰 程序猿

时间: 2023-05-22 阅读: 1 字数:3208

{}
Java中的应用:Java中的synchronized、ReentrantLock等,数据库中的行锁、表锁,读锁,写锁都是这种机制,操作之前先上锁。应用场景:悲观锁适合写多操作。概念:假设最好的情况,每次拿数据都不会认为会更改,而是...

目录

Java并发锁分类

悲观锁(synchronized、ReentrantLock)、乐观锁(CAS) 自选锁(CAS) 可重入锁(synchronized、Lock) 读写锁(ReentrantReadWriteLock) 公平锁(Reentrantlock(true))、非公平锁(synchronized、Reentrantlock(false)) 共享锁(ReentrantReadWriteLock中读锁)、独占锁(synchronized、ReentrantLock、ReentrantReadWriteLock中写锁) 互斥锁(synchronized、ReentrantLock) 排它锁(synchronized、ReentrantLock) 同步锁(synchronized、ReentrantLock) 偏向锁、轻量级锁、重量级锁、锁粗化、锁消除(synchronized锁的优化) 死锁 分段锁(ConcurrentHashMap) 分布式锁(中间件)

悲观锁和乐观锁

悲观锁

概念:假设最坏的情况,任何线程操作资源都要加锁。

Java中的应用:Java中的synchronized、ReentrantLock等,数据库中的行锁、表锁,读锁,写锁都是这种机制,操作之前先上锁。

应用场景:悲观锁适合写多操作。

乐观锁

概念:假设最好的情况,每次拿数据都不会认为会更改,而是在这期间去判断有没有更新数据。

Java中的应用:Java中的CAS算法Atomic原子类就是乐观锁。

缺点:ABA问题、循环时间长开销大、只能保证一个共享变量的原子操作

应用场景:乐观锁适合读多操作。

自旋锁

概念:让线程一直处于等待状态,做我旋转的过程(用while、for循环)。

Java中的应用:Java CAS算法。

优点:减少线程切换的消耗。

缺点:浪费处理器资源

应用场景:适用于并发度不大的场景,这样可以避免线程切换来提高效率

可重入锁

概念:指锁可以嵌套自己(自己可以再次获取自己的内部锁),也就递归锁。原理:每次线程获得该锁计数自增1,直到0才会释放锁。如果不支持可重入锁则会死锁,所以java为了避免这种情况是支持的。

Java中的应用:synchronized、lock锁都支持可重入锁

作用:解决死锁

问题1:可重入锁两把锁,只开了一把,会出现什么情况?

程序阻塞,申请几把锁就需要开几把锁。

问题2:可重入锁上了一把,开了两把,会出现什么情况?

报错java.lang.IllegalMonitorStateException。

读写锁

概念:允许读取资源无锁,写操作上锁。

Java中的应用:ReentrantReadWriteLock

作用:优化了读操作性能。

公平锁和非公平锁

公平锁

概念:线程按有序顺序获取获得资源

Java中的应用:Reentrantlock(true)

作用:分配资源有序平均。

非公平锁

概念:线程竞争获取资源

Java中的应用:synchronized、Reentrantlock默认就是非公平

共享锁和独享锁

共享锁:没有线程修改的情况,允许多个线程读取

共享锁、乐观锁、读写锁同义。

Java中的应用:ReentrantReadWriteLock读操作

独享锁:线程修改的情况,不允许读取

独享锁、互斥锁、排它锁、悲观锁、同步锁同义。

Java中的应用:synchronized、Reentrantlock、ReentrantReadWriteLock写操作

偏向锁、轻量级锁、重量级锁、锁粗化、锁消除

都是针对Synchronized锁的优化。

死锁

概念:同步中嵌套同步

分段锁

ConcurrentHashMap 就是采用分段锁机制,这样可以减少同一个锁的竞争,从而提高效率。

分布式锁(中间件)

在分布式项目中,需要采用中间件来解决并发数据问题:如redis、zk。

原文地址:https://blog.csdn.net/qq_37493888/article/details/125114608?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168475003116800225547372%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168475003116800225547372&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-125114608-null-null.142^v87^insert_down28,239^v2^insert_chatgpt&utm_term=java%E4%BC%98%E5%8C%96

本文章网址:https://www.sjxi.cn/detil/b8ac68d4805840e6bffd7eef76be56f6

打赏作者

本站为非盈利网站,如果您喜欢这篇文章,欢迎支持我们继续运营!

最新评论
当前未登陆哦
登陆后才可评论哦

湘ICP备2021009447号

×

(穷逼博主)在线接单

QQ: 1164453243

邮箱: abcdsjx@126.com

前端项目代做
前后端分离
Python 爬虫脚本
Java 后台开发
各种脚本编写
服务器搭建
个人博客搭建
Web 应用开发
Chrome 插件编写
Bug 修复