10-Synchronized:悲观锁,可重入锁

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38331606/article/details/84620199
  1. Synchronized:悲观锁,可重入锁
    1. 特点:可重入的锁

可重入锁,一个获得的锁的线程没执行完可以继续获得该锁。

线程占用锁的时候,如果执行的同步代码出现异常,会自动将锁让出。

同步代码块的代码是同步执行的(一次执行完),而非同步代码块的代码可以异步执行。

要求锁的获取和释放存在同一个块结构中;当获取了多个锁时,它们必须以相反的顺序释放

    1. 使用注意事项:区分锁对象(锁不同没有互斥作用)

分类

具体分类

当前锁对象

伪代码

同步

方法

实例方法

当前实例对象

public synchronized void myMethod(){...}

静态方法

类对象

public static synchronized void myMethod(){...}

实例对象

当前实例对象

synchronized(this){...}

Class对象

类对象

synchronized(MyClass.class){...}

Object对象

实例对象obj

synchronized(obj){...}

 

    1. 原理:

Synchronized用于锁住当前的对象。当执行到被synchronized修饰的代码时,需先获取当前的锁对象。获取失败,则进入阻塞队列中等待;获取成功则执行代码,执行完成后释放锁对象,并通知阻塞队列。

    1. synchronized的happens-before关系:先加锁后释放锁
    2. JMM中的内存可见性

锁获取成功时,从主存读取共享变量到本地内存中;释放锁成功时,强制刷新本地内存数据到主存中。

    1. Synchronized优化

使用的是悲观锁的策略,即同一时间只能有一个线程去获得锁。而CAS是乐观锁的策略,

猜你喜欢

转载自blog.csdn.net/qq_38331606/article/details/84620199