Java并发编程之悲观、乐观、公平、非公平锁

一般的情况下只有做写的时候才会上锁。
写: update del insert
查:select
Java并发编程之悲观、乐观、公平、非公平锁

悲观锁:

就是比较悲观,每次在在执行我们同步代码块的时候都会获取锁,如果没有获取到锁的情况下,当前线程会被变为阻塞状态,效率比较低。
阻塞→就绪

Mysql中行锁概念

在mysql中多个线程对同一行数据做写的操作的时候,默认会触发的行锁的机制,最终只有一个线程才能对该行数据做写的操作.
其他的线程会被等待。

悲观锁应用场景:

synchronized
mysql 中的行锁机制
Lock锁。

事务原理

Beign—触发行锁机制获取锁的权限
Comnit/ rollback—释放锁
Java并发编程之悲观、乐观、公平、非公平锁

commit前:

Java并发编程之悲观、乐观、公平、非公平锁Java并发编程之悲观、乐观、公平、非公平锁

commit后:

Java并发编程之悲观、乐观、公平、非公平锁
数据库查询不到 行锁状态,因为已经释放
Java并发编程之悲观、乐观、公平、非公平锁

Commit—数据提交到数据库中同时释放锁
Rollback—回滚数据,同时释放锁

没有commit

第一次运行正常,但是因为没有释放锁,第二次运行会 获取锁超时
Java并发编程之悲观、乐观、公平、非公平锁
Java并发编程之悲观、乐观、公平、非公平锁

如何查看mysql中行锁?

select * from information schema. innodb_ trx t

Java并发编程之悲观、乐观、公平、非公平锁Java并发编程之悲观、乐观、公平、非公平锁

乐观锁机制:

乐观锁比较乐观,做写的操作没有锁概念,也就是不会导致我们程序阻塞。
底层通过版本号码或者阈值的形式比较CAS、自旋

Java并发编程之悲观、乐观、公平、非公平锁
优点:效率比较高 没有阻塞概念 无锁机制
缺点:通过死循环控制非常消耗服务器内存

Java并发编程之悲观、乐观、公平、非公平锁
Java并发编程之悲观、乐观、公平、非公平锁

共享锁与独占锁

独占锁:

多个线程中最终只有一一个线程持有锁。

共享锁:

多个线程可以共同一-把锁lock 读写锁
两个线程同时读的