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

本文详细解析Synchronized锁的特点及工作原理,包括其作为悲观锁和可重入锁的特性,以及在Java多线程环境中的应用。探讨了同步代码块与方法的实现方式,锁的获取与释放机制,以及在异常情况下的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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是乐观锁的策略,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值