简介
- 悲观锁:没有安全感,一上来就直接加锁,
每次只能一个线程进入访问
,访问完毕之后,再解锁。线程安全,但是性能差。- 乐观锁:很乐观,一开始不上锁,认为没有问题。等到
要出现线程安全问题的时候才进行控制
,线程安全,性能好。
同步-悲观锁
之前学习的同步思想就是 悲观锁
public class MyRunnable implements Runnable{
private int count = 0;
@Override
public void run() {
for (int i = 0; i < 100; i++) {
add();
}
}
public synchronized void add(){
System.out.println("count = " + (++count));
}
}
Runnable runnable = new MyRunnable();
for (int i = 1; i <= 100; i++) {
new Thread(runnable).start();
}
乐观锁
- 首先我们可以假设一下,其实出现
线程安全问题的概率并不大
- 遵循的事CAS算法:compare and set
每次执行修改代码之前,记录原始的数值,当修改的时候,比较一下是不是还是原始值
- 如果是原始值,线程安全,修改值
- 如果不是原始值,现成不按照,废除此次执行,使用修改后的值再重新执行
- 因为乐观锁是一个非常重要的概念,所以
java中已经内置了很多乐观锁机制
public class MyRunnable implements Runnable{
// private int count = 0;
// 整数修改的乐观锁:原子类进行实现
private AtomicInteger count = new AtomicInteger(0);
@Override
public void run() {
for (int i = 0; i < 100; i++) {
add();
}
}
public void add(){
// 对数值先加1,再输出
System.out.println("count = " + count.incrementAndGet());
}
}