Java中的应用:Java中的synchronized、ReentrantLock等,数据库中的行锁、表锁,读锁,写锁都是这种机制,操作之前先上锁。应用场景:悲观锁适合写多操作。概念:假设最好的情况,每次拿数据都不会认为会更改,而是...
悲观锁(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。
本站为非盈利网站,如果您喜欢这篇文章,欢迎支持我们继续运营!
本站主要用于日常笔记的记录和生活日志。本站不保证所有内容信息可靠!(大多数文章属于搬运!)如有版权问题,请联系我立即删除:“abcdsjx@126.com”。
QQ: 1164453243
邮箱: abcdsjx@126.com