Atitit 并发锁机制 艾提拉总结 目录 1. 2. 用的比较频繁锁 2 1.1. 语法锁sync api锁 2 1.2. 数据库标志位锁 2 1.3. 文件锁 2 2. 锁得类型 3 2 2.

Atitit 并发锁机制 艾提拉总结

 

目录

1. 2. 用的比较频繁锁 2

1.1. 语法锁sync  api锁 2

1.2. 数据库标志位锁 2

1.3. 文件锁 2

2. 锁得类型 3 2

2.1. 轻量级锁 vs 重量级锁 2

2.2. App锁 vm锁 os锁 cpu锁 3

2.3. 2.1. 排它锁 “互斥锁 共享锁 3

2.4. 乐观锁与悲观锁 乐观锁: 3 3

2.5. 2.2. 自旋锁还是信号量 3 3

2.6. 个监视器锁(monitor) 3

2.7. 互斥锁 3

2.8. 2.3. -自释放 vs 手动释放 3 3

2.9. 2.4. 按照使用者 数据库锁  操作系统锁 app锁 3

2.10. 2.5. 按照外观 u型锁 一字锁 月牙锁 3

2.11. 语法锁  api锁   3 3

2.12. 偏向锁 4

2.13. 大锁 小锁 细粒度锁 大力度所 4

2.14. 2.6. 按照工作原理 弹簧锁  弹子锁 3 5

2.15. 2.8. 行级锁 表级别锁 根据锁的粒度来区分 3 5

2.16. 2.9.  表级锁:5种  共享锁(SHARE) 排他(EXCLUSIVE) 5

2.17. 2.11. 按照数据库维度分类 共享锁与排它锁 更新锁  7 5

2.18. 内存锁 文件锁 数据库锁 标志位锁 5

2.19. 比特锁 字节锁 5

2.20. 按照语言分 php锁 java锁 net锁 5

2.21. 跨语言锁 5

2.22. 分布式锁  非分布式 跨进程锁 5

2.23. 共享内存空间计数锁 剪贴板锁 6

2.24. 队列所 6

2.25. 同步锁 6

2.26.  读写锁是一种特殊的自旋锁, 6

3. 4. 锁的实现机制 大多是基于数据版本versin记录机制 9 7

3.1. 4.1.1. 乐观锁另一种实现方式CAS 10 7

3.2. 4.2. test and set”指令 10 7

3.3. 4.3. 锁内存总线 10 7

3.4. 4.4. 硬件层面,CPU提供了原子操作、关中断、锁内存总线的机制 10 7

3.5. 内存屏障、 7

3.6. CAS操作 7

3.7. 、LOCK指令 7

3.8. 操作系统提供的互斥锁 互斥锁(Mutex Lock) 7

4. 常见vm锁机制 7

4.1. Monitor监视器锁  java c#net的vm锁实现机制 7

5. reef 8

 

  1. 2. 用的比较频繁锁
    1. 语法锁sync  api锁
    2. 数据库标志位锁
    3. 文件锁
  2. 锁得类型 3
    1. 轻量级锁 vs 重量级锁

Sync是重量级所,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。

但是监视器锁本质又是依赖于底层的操作系统的互斥锁(Mutex Lock)来实现的

这种依赖于操作系统互斥锁(Mutex Lock)所实现的锁我们称之为“重量级锁”。

 

轻量级锁依赖于cas机制

    1. App锁 vm锁 os锁 cpu锁
    2. 2.1. 排它锁 “互斥锁 共享锁 
    3. 乐观锁与悲观锁 乐观锁: 3
    4. 2.2. 自旋锁还是信号量 3
    5. 个监视器锁(monitor)

我们直接参考JVM规范中描述:每个对象有一个监视器锁(monitor)

 

当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程如下:

 

    1. 互斥锁

 编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象

 

    1. 2.3. -自释放 vs 手动释放 3
    2. 2.4. 按照使用者 数据库锁  操作系统锁 app锁
    3. 2.5. 按照外观 u型锁 一字锁 月牙锁
    4. 语法锁  api锁   3

 

Synchronized  Monitor类

C#的lock关键字

2.7. 实现方式,语言方式与库方式 3

 

Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。

但是监视器锁本质又是依赖于底层的操作系统的互斥锁(Mutex Lock)来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。

因此,这种依赖于操作系统互斥锁(Mutex Lock)所实现的锁我们称之为“重量级锁”。

 

Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。

但是监视器锁本质又是依赖于底层的操作系统的互斥锁(Mutex Lock)来实现的

这种依赖于操作系统互斥锁(Mutex Lock)所实现的锁我们称之为“重量级锁”。

 

    1. 偏向锁

根据轻量级锁的实现,我们知道虽然轻量级锁不支持“并发”,遇到“并发”就要膨胀为重量级锁,但是轻量级锁可以支持多个线程以串行的方式访问同一个加锁对象。

比如A线程可以先获取对象o的轻量锁,然后A释放了轻量锁,这个时候B线程来获取o的轻量锁,是可以成功获取得,以这种方式可以一直串行下去。

 

之所以能实现这种串行,是因为有一个释放锁的动作。那么假设有一个加锁的java方法,这个方法在运行的时候其实从始至终只有一个线程在调用,但是每次调用完却也要释放锁,下次调用还要重新获得锁。

那么我们能不能做一个假设:“假设加锁的代码从始至终就只有一个线程在调用,如果发现有多于一个线程调用,再膨胀成轻量级锁也不迟”。这个假设,就是偏向锁的核心思想。

   偏向锁依赖了一种叫做CAS(compare and swap)的操作。

 

 

    1. 大锁 小锁 细粒度锁 大力度所

 

    1. 2.6. 按照工作原理 弹簧锁  弹子锁 3
    2. 2.8. 行级锁 表级别锁 根据锁的粒度来区分 3
    3. 2.9.  表级锁:5种  共享锁(SHARE) 排他(EXCLUSIVE) 

悲观锁: 乐观锁: 4

2.10. PS:只有共享锁与共享锁相互兼容,共享锁与排它锁、排它锁之间都互不兼容 7

    1. 2.11. 按照数据库维度分类 共享锁与排它锁 更新锁  7

2.12. 按照思想维度分类 悲观锁 乐观锁 7

    1. 内存锁 文件锁 数据库锁 标志位锁
    2. 比特锁 字节锁
    3. 按照语言分 php锁 java锁 net锁
    4. 跨语言锁 
    5. 分布式锁  非分布式 跨进程锁

分布式锁可以使用redis zookeep来实现

    1. 共享内存空间计数 剪贴板锁
    2. 队列所
    3. 同步锁
    4.  读写锁是一种特殊的自旋锁,

它把对共享资源对访问者划分成了读者和写者,读者只对共享资源进行访问,写者则是对共享资源进行写操作

 

 

  1. 4. 锁的实现机制 大多是基于数据版本versin记录机制 9
    1. 4.1.1. 乐观锁另一种实现方式CAS 10
    2. 4.2. test and set”指令 10
    3. 4.3. 锁内存总线 10
    4. 4.4. 硬件层面,CPU提供了原子操作、关中断、锁内存总线的机制 10
    5. 内存屏障、
    6. CAS操作
    7. 、LOCK指令
    8. 操作系统提供的互斥锁 互斥锁(Mutex Lock)

 

  1. 常见vm锁机制
    1. Monitor监视器锁  java c#net的vm锁实现机制

每个对象有一个监视器锁(monitor)

 

 

Monitor.Enter与Monitor.Exit

Monitor.Enter和Monitor.Exit这个东西跟lock的作用一样。事实上。lock就是Monitor.Enter和Monitor.Exit的包装。

  下面用Monitor.Enter与Monitor.Exit来实现相同的代码:

 

  1. reef

 

Atitit 粘贴路径参数法 跨进程通讯法

 

 

Atitit.软件与编程语言中的锁机制原理attilax总结

Java并发机制及锁的实现原理 - yuluoxingkong - 博客园

锁机制与原子操作 _第四篇_ - 逆心 - 博客园

posted @ 2019-09-14 23:00  attilaxAti  阅读(32)  评论(0编辑  收藏  举报