-
可重入锁:
-
a(b(c(d()))):只要外层已经获取了锁,内层可以直接使用,而无需等锁
-
-
公平锁/非公平锁
-
公平锁:按照抢锁的顺序一个个得锁;先来先得。维护公平性
-
非公平锁:随机抢锁,没有顺序。手快者得。
-
-
乐观锁/悲观锁
-
乐观锁:写代码要乐观,觉得这个代码大多情况下不会产生竞争关系,真并发竞争了,在竞争的那个时候再加锁。 一般数据库 可以用version版本来做。
-
数据库 每条记录 version 机制
-
AtomicInteger:无锁机制。利用CAS原理;比较并交换。不用加锁锁住别人。
-
-
悲观锁:
-
写代码总比较悲观,上来就加锁。再执行代码
-
-
-
无锁/偏向锁/轻量级锁/重量级锁
-
synchronized: 如果使用这种语法糖。jvm会自动控制加解锁的过程
-
synchronized就是抢对象头的锁标志位(2位 = 4种可能)
-
-
1、00(无锁):代码不执行:默认是无锁;内存中不用有任何锁维护信息
-
2、01(偏向锁):代码只有一个人执行:使用偏向锁
-
锁是可重入的
-
更多人再来抢锁,升级
-
-
3、10(轻量级锁): jvm告诉抢锁的人,现在只有少量线程,你只需要自旋就能短时内得到锁
-
优点:快
-
缺点:非常耗费CPU资源
-
-
4、11(重量级锁):jvm告诉抢锁的人,现在大量线程都在抢这个锁,短时间内等不到。使用线程通信机制等待,我到时候唤醒你。 wait();notify();
-
优点:腾出CPU资源
-
缺点:慢
-
-
JVM锁升级机制:synchronized; 00 -- 01 -- 10 -- 11 -- 00
-
保证:总有一个偏向锁正在执行,还有一个在自旋,剩下的人在等待
-
-
自旋锁
-
利用while(true)机制一直疯狂重试
-
-
读写锁、CountDownLatch(闭锁)、Semaphore(信号量)、CyclicBarrier(循环栅栏)
-
读加读锁:都是读相当于无锁; 读锁是:共享锁。
-
写加写锁:夹着写操作,读就等写完。 写锁是:排他锁。
-
-
共享锁、排他锁
-
表锁、行锁、间隙锁
-
InnoDB:修改数据如果不带索引。只能锁整张表
-
update aaa set a = a+1 where id=5;
-
update aaa set a = a+1 where id=5;
-
update aaa set a = a+1 where id=5;
-
以上从0-10000可以的
-
精确锁住某一行
-
-
MyISAM:直接锁整张表
-
间隙锁:一整段,部分记录;
-
-
......
Java中常见的锁
最新推荐文章于 2025-04-18 18:23:10 发布