简介: 关于锁的基本概念理解

锁机制用来实现进程线程的同步互斥,保证操作数据的正确性/一致性,来一个一个盘一下:

1.互斥锁:每个线程在对共享资源进行操作前先申请互斥锁,申请到的可以进行操作,没申请到的要阻塞阻塞阻塞!

互斥锁的释放只能由加锁的那个线程来释放。

互斥锁只有加锁、解锁两种操作。

2.读写锁:读写锁适合用于读操作多的场景。拥有读锁的线程可以读资源,拥有写锁的线程可以写资源。

某线程对资源加读锁时,其他线程可以也可以加读锁,但是不能加写锁(意味着有人在读的时候,其他人也能读,不能写)。

某线程对资源加写锁时,其他线程什么锁都不能加(意味着有人在写的时候,其他人什么都不能干)。

如果去申请不能加的锁,则阻塞。

读写锁有加读锁、加写锁、解锁三种操作。

3.自旋锁:线程在获取共享资源前先申请获取锁,如果申请不到,则一直继续申请(而不是阻塞),直到申请到为止。

4.排他锁:等于读写锁中的写锁,因为其他人什么都不能干,所以“排他”。

5.共享锁:等于读写锁中的读锁,因为其他人还可以读,所以“共享”。

6.悲观锁:用在数据库中的概念。意思是悲观的认为每次读数据的过程中别人都会修改(还用读取缓冲区数组理解,不要用读取单个变量理解,有可能读了一半数组而后一半被人改了),所以每次读取数据之前都要加锁。

如数据库的行锁,表锁等。

7.乐观锁:也是用在数据库中的概念。意思是乐观的认为每次读数据的过程中别人都不会改,但是在读完进行写的时候会判断在此期间别人有没有去改这个数据,如果别改了,自己就改不成了,要回退。

适用于读操作多的场景。

重入公平判断

简单的说

中断就是可以停止当前状态

公平就是保证顺序对优先执行权不敏感

重入就是A锁被获取时这个时候B来拿A还能拿到一个A锁 只不过这个A锁类似是本来的子锁 不是同一个 类似A A1的意思 在这个时候是可以进去锁控制的代码 但是实际执行还是按照顺序来的

相关文章
|
2月前
|
存储 关系型数据库 MySQL
MySQL数据库锁:共享锁和独占锁
本文详细介绍了`InnoDB`存储引擎中的两种行级别锁:共享锁(S锁)与排他锁(X锁)。通过具体示例展示了这两种锁的工作机制及其在`InnoDB`与`MyISAM`引擎中的表现差异。文章还提供了锁的兼容性矩阵,帮助读者更好地理解锁之间的互斥关系。最后总结了两种锁的特点及适用场景。适合希望深入了解`MySQL`并发控制机制的读者阅读。
96 1
|
4月前
|
SQL 关系型数据库 MySQL
MySQL使用行级锁时,并非直接锁定记录,而是锁定涉及的索引。对于表`user_item`,更新语句先锁定非主键索引`idx_1`,再锁定主键索引。若两条更新语句分别按不同顺序锁定这两个索引,可能导致互相等待对方释放锁,引发死锁。解决方案包括先查询待更新记录的主键,再按主键更新,确保一致的锁定顺序。
46 2
|
4月前
|
SQL 关系型数据库 MySQL
临键锁引发的死锁
【8月更文挑战第4天】
44 0
临键锁引发的死锁
|
4月前
|
数据库 SQL
间隙锁+临键锁
【8月更文挑战第1天】
51 0
|
Linux API C++
锁、避免死锁等相关
锁、避免死锁等相关
71 0
《锁》有那些?
锁是计算机科学中用于控制对共享资源的访问的一种同步机制。不同种类的锁适用于不同的场景和需求。下面是一些常见的锁的种类及其详细介绍:
83 1
|
存储 算法 安全
辛辛苦苦的劳动成果,如何上把锁?
辛辛苦苦的劳动成果,如何上把锁?
|
数据可视化 Java
lock锁和死锁
lock锁和死锁
共享锁(读锁)和排他锁(写锁)
共享锁(读锁)和排他锁(写锁)
206 0
|
PHP
并发锁(二):共享锁和独占锁
并发锁(二):共享锁和独占锁
219 0
并发锁(二):共享锁和独占锁