Java锁的种类繁多,而且面试频次也非常高,所以我单独把它汇总出来讲解。
为了助大家掌握好锁,这节课我重点会讲解以下5点:
1.常见锁的种类
2.悲观锁与乐观锁
3.JVM对锁进行了哪些优化
4.自旋锁
5.公平锁与非公平锁
Java锁的种类
1.乐观锁
顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制
乐观锁适用于多读的应用类型,乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现的
CAS全称 Compare And Swap(比较与交换),是一种无锁算法。
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}
2.悲观锁
1)Synchronized
/**
* 用在普通方法
*/
private synchronized void synchronizedMethod() {
System.out.println("--synchronizedMethod start--");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("--synchronizedMethod end--");
}
2)ReentrantLock
private ReentrantLock lock = new ReentrantLock();
// 卖票
public void sell() {
while (ticketNum > 0) {
try {
lock.lock();
if (ticketNum > 0) {
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " 正在出售第 " + (ticketNum--));
}
} finally {
// 释放锁
lock.unlock();
}
}
}
Synchronized的锁升级流程
隐藏内容,您需要满足以下条件方可查看
End
No related posts.