
【Java】synchronized同步锁解析
5星
- 浏览量: 0
- 大小:None
- 文件类型:PDF
简介:
本文深入解析Java中的synchronized关键字及其工作原理,探讨如何使用同步锁来实现线程安全和控制并发访问。
### Java锁的种类
#### 乐观锁
乐观锁是一种假设读操作多于写操作且并发冲突较少的思想。每次获取数据时不加锁,在更新之前会检查是否有其他线程进行了更改,如果一致则进行修改。
Java 中的一些类如 `AtomicInteger` 和 `AtomicReference` 使用了乐观锁的实现方式CAS(Compare and Swap)来确保原子性操作。
#### 悲观锁
悲观锁假设并发冲突频繁,每次访问数据时都会加锁。这可以防止其他线程在获取到该资源前对其进行修改。Java中的`synchronized`关键字就是一种典型的悲观锁机制,它保证了同一时刻只有一个线程能够执行特定的代码块。
#### 自旋锁
自旋锁是指当一个线程请求获得被其它线程持有的锁时,并不会立即进入阻塞状态等待,而是以循环的方式不断尝试获取该锁。如果持有锁的线程很快释放,则这种机制效率较高;但若持锁时间较长,则会导致CPU资源浪费。
### synchronized同步锁(悲观锁)
#### 作用范围
- **实例方法**:锁定当前对象实例。
- **静态方法**:锁定类级别的Class实例,这意味着所有调用该静态方法的线程都会被阻塞。
- **对象实例**:锁定特定的对象,确保同一时刻只有一个线程可以访问这个对象上的同步代码块或同步方法。
#### 核心组件
包括等待集合(Wait Set)、竞争队列(Contention List)和资格者列表(Entry List),当前尝试获取锁的线程以及持有锁的线程等组成部分。当有新的请求时,这些新加入的竞争队列中的线程会经过筛选进入资格者列表中准备参与下一轮锁的竞争。
#### 实现
JVM在处理同步机制时,通过将等待竞争锁的线程从Contention List转移到Entry List,并从中选择一个作为OnDeck来尝试获取锁。当持有锁的线程释放锁后,部分处于Contention List中的线程会被移动到Entry List中准备下一次的竞争。
### 注意事项
使用`synchronized`关键字时需要注意以下几点:
- 无法通过中断阻塞:由`synchronized`导致的等待状态不能被其他手段(如调用interrupt()方法)打断。
- 性能开销:虽然保证了线程安全,但会带来额外的上下文切换成本影响性能表现。
- 死锁风险:不恰当使用可能导致死锁问题出现。
综上所述,正确理解和应用`synchronized`是Java并发编程中的重要环节。它能够保障数据的一致性和完整性,并防止由于多线程导致的数据冲突和错误。在实际开发中选择合适的锁定机制可以有效提升系统的性能表现。
全部评论 (0)


