Java并发编程之悲观、乐观、公平、非公平锁
一般的情况下只有做写的时候才会上锁。
写: update del insert
查:select
悲观锁:
就是比较悲观,每次
在在执行
我们同步代码块的时候都会获取锁
,如果没有获取到锁的情况下,当前线程会被变为阻塞状态,效率比较低。
阻塞→就绪
Mysql中行锁概念
在mysql中多个线程对同一行数据做写的操作的时候,默认会触发的行锁的机制,最终只有一个线程才能对该行数据做写的操作.
其他的线程会被等待。
悲观锁应用场景:
synchronized
mysql 中的行锁机制
Lock锁。
事务原理
Beign—触发行锁机制获取锁的权限
Comnit/ rollback—释放锁
commit前:
commit后:
数据库查询不到 行锁状态,因为已经释放
Commit
—数据提交到数据库中同时释放锁
Rollback
—回滚数据,同时释放锁
没有commit
:
第一次运行正常,但是因为没有释放锁,第二次运行会 获取锁超时
如何查看mysql中行锁?
select * from information schema. innodb_ trx t
乐观锁机制:
乐观锁比较乐观,做写的操作没有锁概念,也就是不会导致我们程序阻塞。
底层通过版本号码或者阈值的形式比较CAS、自旋
优点
:效率比较高 没有阻塞概念 无锁机制缺点
:通过死循环控制非常消耗服务器内存
共享锁与独占锁
独占锁:
多个线程中最终只有一一个线程持有锁。
共享锁:
多个线程可以共同一-把锁lock 读写锁
两个线程同时读的