浦东新区建设机械网站,梵克雅宝官网中文官网,个人网站建设基本教程,湖州营销网站建设悲观锁
总是假设最坏的情况#xff0c;每次取数据的时候都认为别人会来修改#xff0c;所以每次取数据的时候都会上锁。其它线程想要取这份数据就必须拿到相应的锁#xff08;共享资源每次只供一个线程使用#xff0c;其它线程阻塞#xff0c;用完之后转让给其他线程每次取数据的时候都认为别人会来修改所以每次取数据的时候都会上锁。其它线程想要取这份数据就必须拿到相应的锁共享资源每次只供一个线程使用其它线程阻塞用完之后转让给其他线程。
传统关系型数据库里有很多悲观锁的实现如行锁、表锁、读写锁。Java中的synchronized和ReetrantLock 等独占锁就是悲观锁的实现。
MySQL InnoDB中使用悲观锁
要使用悲观锁我们必须关闭mysql数据库的自动提交属性因为MySQL默认使用autocommit模式也就是说当你执行一个更新操作后MySQL会立刻将结果进行提交。
set autocommit0;select…for update使用select…for update会把数据给锁住不过我们需要注意一些锁的级别MySQL InnoDB默认行级锁。行级锁都是基于索引的如果一条SQL语句不用索引会使用表级锁把整张表锁住这点需要注意。
悲观锁机制存在以下问题 在多线程竞争下加锁、释放锁会导致比较多的上下文切换和调度延时引起性能问题。 一个线程持有锁会导致其它所有需要此锁的线程挂起。 假如一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置引起性能风险。
乐观锁
总是假设最好的情况每次取数据时都认为别人不会修改所以不会上锁但是在更新的时候会先判断在此期间是否有别的线程更新这份数据通过版本号机制或CAS算法实现。乐观锁用于多读少写的场景这样能够提高吞吐量
java.util.concurrent.atomic包下面的原子变量类就是通过乐观锁的CAS方式来实现的。 CAS算法见我之前的博文。