Atitit 并发锁机制 艾提拉总结
目录
2.9. 2.4. 按照使用者 数据库锁 操作系统锁 app锁 3
2.15. 2.8. 行级锁 表级别锁 根据锁的粒度来区分 3 5
2.16. 2.9. 表级锁:5种 共享锁(SHARE) 排他(EXCLUSIVE) 5
2.17. 2.11. 按照数据库维度分类 共享锁与排它锁 更新锁 7 5
3. 4. 锁的实现机制 大多是基于数据版本versin记录机制 9 7
3.1. 4.1.1. 乐观锁另一种实现方式CAS 10 7
3.2. 4.2. test and set”指令 10 7
3.4. 4.4. 硬件层面,CPU提供了原子操作、关中断、锁内存总线的机制 10 7
3.8. 操作系统提供的互斥锁 互斥锁(Mutex Lock) 7
4.1. Monitor监视器锁 java c#net的vm锁实现机制 7
Sync是重量级所,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。
但是监视器锁本质又是依赖于底层的操作系统的互斥锁(Mutex Lock)来实现的
这种依赖于操作系统互斥锁(Mutex Lock)所实现的锁我们称之为“重量级锁”。
轻量级锁依赖于cas机制
我们直接参考JVM规范中描述:每个对象有一个监视器锁(monitor)。
当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程如下:
在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象
Synchronized Monitor类
C#的lock关键字
2.7. 实现方式,语言方式与库方式 3
Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。
但是监视器锁本质又是依赖于底层的操作系统的互斥锁(Mutex Lock)来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。
因此,这种依赖于操作系统互斥锁(Mutex Lock)所实现的锁我们称之为“重量级锁”。
Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。
但是监视器锁本质又是依赖于底层的操作系统的互斥锁(Mutex Lock)来实现的
这种依赖于操作系统互斥锁(Mutex Lock)所实现的锁我们称之为“重量级锁”。
根据轻量级锁的实现,我们知道虽然轻量级锁不支持“并发”,遇到“并发”就要膨胀为重量级锁,但是轻量级锁可以支持多个线程以串行的方式访问同一个加锁对象。
比如A线程可以先获取对象o的轻量锁,然后A释放了轻量锁,这个时候B线程来获取o的轻量锁,是可以成功获取得,以这种方式可以一直串行下去。
之所以能实现这种串行,是因为有一个释放锁的动作。那么假设有一个加锁的java方法,这个方法在运行的时候其实从始至终只有一个线程在调用,但是每次调用完却也要释放锁,下次调用还要重新获得锁。
那么我们能不能做一个假设:“假设加锁的代码从始至终就只有一个线程在调用,如果发现有多于一个线程调用,再膨胀成轻量级锁也不迟”。这个假设,就是偏向锁的核心思想。
偏向锁依赖了一种叫做CAS(compare and swap)的操作。
悲观锁: 乐观锁: 4
2.10. PS:只有共享锁与共享锁相互兼容,共享锁与排它锁、排它锁之间都互不兼容 7
2.12. 按照思想维度分类 悲观锁 乐观锁 7
分布式锁可以使用redis zookeep来实现
它把对共享资源对访问者划分成了读者和写者,读者只对共享资源进行访问,写者则是对共享资源进行写操作
每个对象有一个监视器锁(monitor)。
Monitor.Enter与Monitor.Exit
Monitor.Enter和Monitor.Exit这个东西跟lock的作用一样。事实上。lock就是Monitor.Enter和Monitor.Exit的包装。
下面用Monitor.Enter与Monitor.Exit来实现相同的代码:
Atitit 粘贴路径参数法 跨进程通讯法
Atitit.软件与编程语言中的锁机制原理attilax总结
Java并发机制及锁的实现原理 - yuluoxingkong - 博客园
锁机制与原子操作 _第四篇_ - 逆心 - 博客园