乐观锁:
也就是不加锁
顾名思义,他很乐观,总是假设最好情况。所以总是觉得别人拿的时候不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据
悲观锁:
加锁解决问题
和乐观锁相反,他总是假设最坏情况。每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。常见的类锁,行锁,静态锁都属于他。
一个小例子
如图,现在有两个相同的线程在执行value++, 并对应存到内存
乐观锁,可以在内存的value中加个版本号,比如第一次a线程value=7存入内存,版本号变成1,第二次存入value=21,版本号变成2,这时候线程value要存入内存时,发现自身版本号与内存版本号没对上,于是不修改内存的value,继续执行++操作。
悲观锁,就是在a线程进行++操作时,直接锁住,此时线程b无法执行,阻塞在阻塞队列中。