互斥锁是一种「独占锁」,比如当线程 A 加锁成功后,此时互斥锁已经被线程 A 独占了,只要线程 A 没有释放手中的锁,线程 B 加锁就会失败,于是就会释放 CPU 让给其他线程,既然线程 B 释放掉了 CPU,自然线程 B 加锁的代码就会被阻塞。
我们以商品为例,现在 线程A 和线程 B 都想吃红薯,但是红薯数量只有 1 个了。我们认为数据修改产生冲突的概率并不大,多个线程在修改数据的之前先查出版本号,在修改时把当前版本号作为修改条件,只会有一个线程可以修改成功,其他线程则会失败。
我们需要明确一点:偏向锁、轻量级锁、重量级锁只针对synchronized。首先,JVM会将锁对象的Mark Word恢复成为无锁状态,在当前两线程的栈帧中各自分配一个空间,叫做Lock Record,把锁对象account的Mark Word在两线程的栈帧中各自复制了一份,官方称为:Displaced Mark Word。
优点:保证性能下限: 虚拟 DOM 可以经过 diff 找出最小差异,然后批量进行 patch,这种操作虽然比不上手动优化,但是比起粗暴的 DOM 操作性能要好很多,因此虚拟 DOM 可以保证性能下限。
MySQL 官方给出了幻读的定义:在同一事务中,相同的 SELECT 语句,得到的结果不一致,并且第二次 select 的 raws 只会比第一次 select 的 raws 要多,这些多出的行,被称为“幻行”。