Synchronized (二)
Synchronized 是一个悲观锁
在并发编程中,线程之间的竞争是不可避免的。为了保证数据的一致性和线程安全,需要采用锁机制来控制对共享资源的访问。Synchronized 是 Java 中最常用的锁机制之一,它是一种悲观锁。
悲观锁与乐观锁的概念
悲观锁和乐观锁是两种不同的锁策略。悲观锁是一种较为保守的策略,它假设并发情况下会发生冲突,因此在访问共享资源之前会先加锁,确保每次只有一个线程能够访问。而乐观锁则是一种更加乐观的策略,它假设并发情况下不会发生冲突,因此在访问共享资源之前不会加锁,而是在更新操作时进行冲突检测。
Synchronized 的实现原理
Synchronized 是 Java 中内置的锁机制,它可以用来修饰方法或代码块。Synchronized 关键字的使用可以保证同一时刻只有一个线程能够执行被修饰的代码块或方法。
Synchronized 的实现原理主要基于对象的监视器(monitor)。每个对象都有一个与之关联的监视器,当一个线程进入 Synchronized 修饰的代码块或方法时,它会尝试获取对象的监视器。如果监视器被其他线程占用,则该线程会被阻塞,直到获取到监视器为止。
下面是一个简单的示例代码,演示了 Synchronized 的使用:
public class SynchronizedDemo {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
public static void main(String[] args) {
SynchronizedDemo demo = new SynchronizedDemo();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
for (int j = 0; j < 1000; j++) {
demo.increment();
}
}).start();
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Count: " + demo.getCount());
}
}
在上述代码中,increment
方法和 getCount
方法都被修饰为 synchronized,确保了对 count
变量的操作是线程安全的。在 main
方法中创建了 10 个线程,每个线程执行 1000 次 increment
方法,最终输出 count
的值。
CAS 的特性及实现原理
CAS(Compare and Swap,比较并交换)是一种乐观锁的实现方式,用于解决并发环境下的数据竞争问题。
CAS的特性包括:
- 原子性:CAS操作是一个原子操作,要么成功,要么失败,不存在中间状态。
- 无阻塞:CAS操作不会阻塞线程,而是通过循环比较直到成功或者达到一定的重试次数。
- 无锁:CAS操作不需要使用传统的锁机制,而是通过硬件的原子操作指令来实现。
CAS的实现原理如下:
- 首先获取要修改的变量的当前值。
- 然后与预期的值进行比较,如果相等,则说明没有其他线程修改该变量,可以进行更新操作。
- 如果不相等,则说明其他线程已经修改了该变量,CAS操作失败,需要重新获取当前值并重新比较。
- 如果比较成功,将新值写入变量,CAS操作完成。
CAS操作在并发环境下可以保证数据的一致性,但是也存在ABA问题,即在某些情况下,变量的值可能经过多次修改后又恢复到原来的值,这时CAS操作可能会误判。为了解决ABA问题,可以使用版本号、时间戳等方式进行扩展。
- 点赞
- 收藏
- 关注作者
评论(0)