Synchronized是一种悲观锁,主要基于线程独占的理念。以下是Synchronized为什么是悲观锁:
- 独占性:当一个线程获得对象的Synchronized锁时,其他线程必须等到线程释放锁才能继续执行,即线程的独占性得到保证。
- 悲观主义:Synchronized锁的使用是基于悲观主义。它认为在并发环境中会有竞争和冲突,因此默认情况下每次访问都会有线程冲突,并确保只有一个线程同时执行。
相比之下,乐观锁的实现原理是基于线程之间不频繁冲突的假设,并发控制是通过控制数据的版本来实现的。其主要思想是允许多个线程同时读取,但在更新数据时需要确保数据的一致性。CAS是常见的乐观锁机制(Compare and Swap)。
CAS是实现乐观锁的一种方式,是一种无锁算法。CAS操作包括内存地址V三个参数、旧的预期值A和新的值B。CAS操作将首先比较内存地址V中的值是否等于预期值A。如果相等,则将内存地址V的值更新为新值B;否则,如果内存地址V的值被其他线程并发修改,CAS操作将失败。
CAS的特点包括:
- 原子性:CAS操作是原子性的,它确保在单个原子步骤中完成共享变量操作,不会受到其他线程的干扰。
- 无锁:CAS操作无锁,不需要像悲观锁一样加锁解锁,减少了线程之间的竞争和开支。
- 自旋重试:如果CAS操作失败,则意味着其他线程已修改共享变量。当前线程需要重试CAS操作,通常采用自旋重试。
需要注意的是,虽然CAS具有高并发性和无锁性,但也存在ABA问题(即一个值被修改为其他值,然后修改为原值),以及自旋重试可能导致的性能问题。为了解决这些问题,Java提供了Atomicintegerer等原子类、AtomicLong、Atomicreference等,利用CAS机制实现线程安全操作。