简介
- 悲观锁:没有安全感,一上来就直接加锁,
每次只能一个线程进入访问
,访问完毕之后,再解锁。线程安全,但是性能差。- 乐观锁:很乐观,一开始不上锁,认为没有问题。等到
要出现线程安全问题的时候才进行控制
,线程安全,性能好。
同步-悲观锁
之前学习的同步思想就是 悲观锁
public class MyRunnable implements Runnable{private int count = 0;@Overridepublic 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);@Overridepublic void run() {for (int i = 0; i < 100; i++) {add();}}public void add(){// 对数值先加1,再输出System.out.println("count = " + count.incrementAndGet());}}