下面分别是作用于临界区、CPU、内存、cache的各种锁的归纳: 一、atomic原子变量/spinlock自旋锁 — —CPU 既然是锁CPU,那就都是针对多核处理器或多CPU处理器。...使用实例如下: #include // 定义自旋锁 spinlock_t my_lock; void my_function(void) { spin_lock...(&my_lock); // 访问共享资源的操作 spin_unlock(&my_lock); } 互斥锁中,要是当前线程没拿到锁,就会出让CPU;而自旋锁中,要是当前线程没有拿到锁,当前线程在...因此一定不能自旋太久,所以用户态编程里用自旋锁保护临界区的话,这个临界区一定要尽可能小,锁的粒度得尽可能小。 为什么自旋锁的响应速度会比互斥锁更快?...另外提一下std::timed_mutex睡眠锁,它和互斥锁的区别是: 互斥锁中,没拿到锁的线程就一直阻塞等待,而睡眠锁则是设置一定的睡眠时间比如2s,线程睡眠2s,如果过了之后还没拿到锁,那就放弃拿锁
接下来我们了解三种常见的Linux下的互斥操作—>锁。 1.互斥锁(mutex) 特点:对于读者和写者来说。只要有一方获取了锁,另一方则不能继续获取,进而执行临界区代码。...创建锁: 有两种方法创建互斥锁,静态方式和动态方式。...对于普通锁和适应锁类型,解锁者可以是同进程内任何线程; 而检错锁则必须由加锁者解锁才有效,否则返回EPERM;对于嵌套锁,文档和实现要求必须由 加锁者解锁,但实验结果表明并没有这种限制,这个不同目前还没有得到解释...2.读写锁 特点:读写锁适合于对数据结构的读次数比写次数多得多的情况.因为,读模式锁定时可以共享,以写 模式锁住时意味着独占,所以读写锁又叫共享-独占锁....一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间),所以自旋锁不应该被持有时间过长。如果需要长时间锁定的话, 最好使用信号量。 API: ?
---- 1.乐观锁和悲观锁 悲观锁和乐观锁并不是某个具体的锁而是一种并发编程的基本概念。乐观锁和悲观锁最早出现在数据库的设计当中,后来逐渐被 Java 的并发包所引入。...2.公平锁和非公平锁 公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁。 非公平锁 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。...3.独占锁和共享锁 独占锁 独占锁是指任何时候都只有一个线程能执行资源操作。 共享锁 共享锁指定是可以同时被多个线程读取,但只能被一个线程修改。...4、可重入锁 可重入锁指的是该线程获取了该锁之后,可以无限次的进入该锁锁住的代码。...为什么非公平锁吞吐量大于公平锁?
参考:https://tech.meituan.com/2018/11/15/java-lock.html 乐观锁 VS 悲观锁 悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁...乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现的。 悲观锁适合写操作多的场景,先加锁可以保证写操作时数据正确。...乐观锁适合读操作多的场景,不加锁的特点能够使其读操作的性能大幅提升。 通过调用方式示例,我们可以发现悲观锁基本都是在显式的锁定之后再操作同步资源,而乐观锁则直接去操作同步资源。...那么,为何乐观锁能够做到不锁定同步资源也可以正确的实现线程同步呢?我们通过介绍乐观锁的主要实现方式 “CAS” 的技术原理来为大家解惑。...CAS全称 Compare And Swap(比较与交换),是一种无锁算法。在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步。
从 JDK 1.6 开始,synchronized 做了很多优化,如偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化等技术来减少锁操作的开销。...synchronized 同步锁一共包含四种状态:无锁、偏向锁、轻量级锁、重量级锁,它会随着竞争情况逐渐升级。...每个类只有一个类锁,但是类可以实例化成对象,因此每一个对象对应一个对象锁。 类锁和对象锁不会产生竞争。 私有锁和对象锁也不会产生竞争。 使用私有锁可以减小锁的细粒度,减少由锁产生的开销。...它拥有读锁(ReadLock)和写锁(WriteLock),读锁是一个共享锁,写锁是一个排他锁。 它的特性: 公平性:支持公平锁和非公平锁。默认使用了非公平锁。...可重入:读线程在获取读锁之后能够再次获取读锁。写线程在获取写锁之后能够再次获取写锁,同时也可以获取读锁(锁降级)。 锁降级:先获取写锁,再获取读锁,然后再释放写锁的过程。
当一个线程永远占有一个锁,而其他线程尝试去获得这个锁,那么他们将永远被阻塞。当线程Thread1占有锁A时,想要获得锁B,但是同时线程Thread2持有B锁,并尝试获得A锁,两个线程将永远等待下去。...如果请求锁的顺序相同, 就不会出现循环的锁依赖现象(你等我放锁,我等你放锁),也就不会产生死锁了。如果你能够保证同时请求锁A和锁B的每一个线程,都是按照从锁A到锁B的顺序,那么就不会发生死锁了。...尽量不要用锁的嵌套,如果必须要用到锁的嵌套,就要指定锁的顺序,因为参数的顺序是超乎我们控制的,为了解决这个问题,我们必须指定锁的顺序,并且在整个应用程序中, 获得锁都必须始终遵守这个既定的顺序。...在内部锁的机制中,只要没有获得锁,就永远保持等待,而 显示的锁使你能狗定义超时的时间,在规定时间之后tryLock还没有获得锁就会返回失败。...在公平锁中,选择权交给等待时间最长的线程;如果锁由读者获得,而一个线程请求写入锁,那么不再允许读者获得读取锁,直到写者被受理,平且已经释放了写锁。 在非公平的锁中,线程允许访问的顺序是不定的。
1.3 页级锁 页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。因此,采取了折衷的页级锁,一次锁定相邻的一组记录。...MySQL中只有InnoDB支持行级锁,行级锁分为共享锁和排他锁。 2、实现原理 在MySQL中,行级锁并不是直接锁记录,而是锁索引。...2.1 共享锁(读锁) shared Locks(S锁) 1、概念 共享锁,又称之为读锁,简称S锁,当事务A对数据加上读锁后,其他事务只能对该数据加读锁,不能做任何修改操作,也就是不能添加写锁。...概念 排它锁,又称之为写锁,简称X锁,当事务对数据加上写锁后,其他事务既不能对该数据添加读写,也不能对该数据添加写锁,写锁与其他锁都是互斥的。...意向锁有两种类型: 1、 意向共享锁(IS) 意向共享锁(IS) 表示事务打算在表中的各个行上设置共享锁。 2 、意向排他锁 意向排他锁 (IX) 表示事务打算在表中的各个行上设置排他锁。
共享锁(读锁)-S:共享锁允许持有该锁的事务能够读取锁定行。排它锁(写锁)-X:排它锁允许持有该锁的事务能够更新和删除锁定行。...共享锁与排它锁的兼容性如下:当一个事务T1持有共享锁时,另一个事务T2可以被授予共享锁,不可以被授予排它锁。当一个事务T1持有排它锁时,另一个事务T2不可以被授予共享锁和排它锁。...图片意向锁InnoDB中的意向锁是一种表级锁,用于指示稍后将对表中的行施加那种锁类型(共享锁或排它锁),意向锁是用于提升表级锁(共享锁、排它锁)的加锁效率的。...当一个事务要对标中的行设置排它锁时,它需要先对这个表施加排它意向锁意向锁和表级共享/排它锁的兼容性如下表所示图片虽然意向锁是表级锁,但是因为施加行锁前需要先设置表级意向锁,因此意向锁不仅影响了表级锁的设置过程...交叉模式 innodb_autoinc_lock_mode=2:任何INSERT语句都不需要持有自增锁。低级锁对象(互斥锁、读写锁)与自旋锁前面介绍的各种锁概念都是面向表、记录。
这两种情况对策是不一样的,对于不可重复读,只需要采取行级锁防止该记录数据被更改或删除,然而对于幻读必须加表级锁,防止在这个表中新增一条数据。...二级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后方可释放S锁。 二级封锁协议除防止了丢失修改,还可以进一步防止读“脏”数据。...但在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。 三级封锁协议 :一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。...因为事务增、删、改数据以后,会在该行加上排它锁,排它锁会阻塞其他事务再次对该行数据操作。...两段锁协议 数据库在调度并发事务时遵循“两段锁”协议,“两段锁”协议是指所有事务必须分两个阶段对数据项进行加锁和解锁 扩展阶段:在对任何数据项的读、写之前,要申请并获得该数据项的封锁。
Fedora Core(自第七版直接更名为Fedora)是众多 Linux 发行套件之一。它是一套从Red Hat Linux发展出来的免费Linux系统。...Redhat应该说是在国内使用人群最多的Linux版本,甚至有人将Redhat等同于Linux,而有些老鸟更是只用这一个版本的Linux。...Debian是社区类Linux的典范,是迄今为止最遵循GNU规范的Linux系统。...不同于APT和YUM等二进制文件分发的包管理系统,Portage是基于源代码分发的,必须编译后才能运行,对于大型软件而言比较慢,不过正因为所有软件都是在本地机器编译的,在经过各种定制的编译参数优化后,能将机器的硬件性能发挥到极致...如果你需要的是一个服务器系统,而且你已经非常厌烦各种Linux的配置,只是想要一个比较稳定的服务器系统而已,那么你最好的选择就是CentOS了,安装完成后,经过简单的配置就能提供非常稳定的服务了。
一、公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁。 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。...对于Java ReentrantLock而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁。非公平锁的优点在于吞吐量比公平锁大。 对于Synchronized而言,也是一种非公平锁。...三、独享锁/共享锁 独享锁是指该锁一次只能被一个线程所持有。 共享锁是指该锁可被多个线程所持有。 对于Java ReentrantLock而言,其是独享锁。...四、互斥锁/读写锁 上面讲的独享锁/共享锁就是一种广义的说法,互斥锁/读写锁就是具体的实现。...从上面的描述我们可以看出,悲观锁适合写操作非常多的场景,乐观锁适合读操作非常多的场景,不加锁会带来大量的性能提升。 悲观锁在Java中的使用,就是利用各种锁。
重量级锁?自旋锁?自适应自旋锁?轻量级锁?偏向锁?悲观锁?乐观锁?执行一个方法咋这么辛苦,到处都是锁。 今天这篇文章,给大家普及下这些锁究竟是啥,他们的由来,他们之间有啥关系,有啥区别。...这种获取不到锁就马上进入阻塞状态的锁,我们称之为重量级锁。...轻量级锁 上面我们介绍的三种锁:重量级、自旋锁和自适应自旋锁,他们都有一个特点,就是进入一个方法的时候,就会加上锁,退出一个方法的时候,也就释放对应的锁。...偏向锁 偏向锁就更加牛逼了,我们已经觉得轻量级锁已经够轻,然而偏向锁更加省事,偏向锁认为,你轻量级锁每次进入一个方法都需要用CAS来改变状态,退出也需要改变,多麻烦。...悲观锁和乐观锁 最开始我们说的三种锁,重量级锁、自旋锁和自适应自旋锁,进入方法之前,就一定要先加一个锁,这种我们为称之为悲观锁。
设置锁、和同步设置锁。...读写锁,或是解锁。...= F_UNLCK) { if (fflock.l_type == F_RDLCK) {//有锁,判断是读锁还是写锁 printf("flock has been set to read lock...(); flock_set(fd, F_UNLCK); //解锁 getchar(); close(fd); return 0; } 写锁是排他性的,文件上了写锁,就会阻止其他程序的写锁与读锁...读锁可以多个程序对同一文件上读锁,除此之外其他情况也会失败(阻止其他程序的读锁与写锁)。
可重入锁 可重入锁,也叫做递归锁,是指在同一个线程在调外层方法获取锁的时候,再进入内层方法会自动获取锁。ReentrantLock 和synchronized 都是 可重入锁。...适合使用自旋锁。 独享锁 独享锁是指该锁一次只能被一个线程所持有。 共享锁 共享锁是指该锁可被多个线程所持有。ReentrantReadWriteLock,其读锁是共享锁,其写锁是独享锁。...互斥锁 独享锁/共享锁就是一种广义的说法,互斥锁/读写锁指具体的实现。...()/unpark() 公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁 非公平锁 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。...分段锁 分段锁其实是一种锁的设计,目的是细化锁的粒度,并不是具体的一种锁,对于ConcurrentHashMap而言,其并发的实现就是通过分段锁的形式来实现高效的并发操作。
重入锁 定义:- 可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。...锁降级: 锁降级是指把持住(当前拥有的)写锁,再获取到读锁,随后释放(先前拥有的)写锁的过程。...偏向锁、轻量级锁、重量级锁 这三种锁是指锁的状态,并且是针对Synchronized。在Java 5通过引入锁升级的机制来实现高效Synchronized。...轻量级锁:是指当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。...独享锁、共享锁 独享锁是指该锁一次只能被一个线程所持有。 共享锁是指该锁可被多个线程所持有。 对于Java ReentrantLock而言,其是独享锁。
我们今天聊一聊MySQL的各种锁吧 ,你有了解Metadata Lock吗? 嗯?(内心:这泥马 ) 嗯!Metadata Lock简称MDL,也就是元数据锁 。 嗯,是的!...好,你再说一下MySQL的表锁吧 表锁就是表级别的锁,而且InnoDB存储引擎层支持表锁。 而且上面说过的MDL锁,个人感觉也可以将元数据锁理解成是表锁中的一种。...想了解这个知识点可以看这篇:全网最牛X的两阶段串讲 你了解间隙锁吗?什么是间隙锁? 间隙锁也是行锁中的一种:但是它会锁定的是一个间隙范围,而不会锁住某条记录。...但是:意向锁也并不是完全形同虚设的,因为它和除意向锁之外其他类型的锁之间是满足读读共享、读写互斥的原则的。 嗯,到现在我们也说了很多锁了,你可否总结一下各种常见锁之间的关系呢? 嗯,好啊!...(可左右滑动) 锁类型 普通独占锁 普通共享锁 意向独占锁 意向共享锁 普通独占锁 互斥 互斥 互斥 互斥 普通共享锁 互斥 不互斥 互斥 不互斥 意向独占锁 互斥 互斥 不互斥 互斥 意向共享锁 互斥
MyISAM) 4.1、锁的分类 锁定表了之后不可以对未锁定的表做操作 按数据类型分类: **读锁(共享锁):**针对同一份数据,多个读操作可以同时进行而不会相互影响 **写锁(排他锁):**当写操作没有完成前...,阻断其他写锁和读锁 按对数据操作的粒度分: 表锁; 行锁; 4.2、手动操作锁 添加表锁 lock table 表名 read(write), 表名2 read(write), 其他 查看表上加过的锁...,每立即获取锁值加1; Table_locks_waited:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁值加1),此值高则说明存在着较严重的表级锁争用情况; 此外,MyISAM...)”**, InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁) 。...优化建议 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁。
领取专属 10元无门槛券
手把手带您无忧上云