4-12-同步锁与死锁

文章目录
  1. 1. 同步锁与死锁
    1. 1.1. 同步锁(Synchronized)
      1. 1.1.1. Synchronized原理
      2. 1.1.2. 早期是重量级锁原因
      3. 1.1.3. jdk6后加入了偏向锁和轻量级锁来优化(有对应的场景才会用这两个锁)
    2. 1.2. 死锁(四个必要条件)
      1. 1.2.1. 1.互斥条件
      2. 1.2.2. 2.请求与保持条件
      3. 1.2.3. 3.不剥夺条件
      4. 1.2.4. 4.循环等待条件

同步锁与死锁

同步锁(Synchronized)

Synchronized原理

JVM规范中描述:每个对象有一个监视器锁(monitor)。

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

1、如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor的所有者。

2、如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1.

3.如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再重新尝试获取monitor的所有权。

Synchronized的语义底层是通过一个monitor的对象来完成,其实wait/notify等方法也依赖于monitor对象,

这就是为什么只有在同步的块或者方法中才能调用wait/notify等方法,否则会抛出java.lang.IllegalMonitorStateException的异常的原因。

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

早期是重量级锁原因

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

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

jdk6后加入了偏向锁和轻量级锁来优化(有对应的场景才会用这两个锁)

死锁(四个必要条件)

指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

1.互斥条件

一个资源每次只能被一个进程使用;

2.请求与保持条件

一个进程因请求资源而阻塞时,对已获得的资源保持不放;

3.不剥夺条件

进程已获得的资源,在末使用完之前,不能强行剥夺;

4.循环等待条件

若干进程之间形成一种头尾相接的循环等待资源关系;