Synchronized (二)

举报
赵KK日常技术记录 发表于 2023/07/07 15:56:28 2023/07/07
【摘要】 Synchronized 是一个悲观锁在并发编程中,线程之间的竞争是不可避免的。为了保证数据的一致性和线程安全,需要采用锁机制来控制对共享资源的访问。Synchronized 是 Java 中最常用的锁机制之一,它是一种悲观锁。 悲观锁与乐观锁的概念悲观锁和乐观锁是两种不同的锁策略。悲观锁是一种较为保守的策略,它假设并发情况下会发生冲突,因此在访问共享资源之前会先加锁,确保每次只有一个线程...

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的特性包括:

  1. 原子性:CAS操作是一个原子操作,要么成功,要么失败,不存在中间状态。
  2. 无阻塞:CAS操作不会阻塞线程,而是通过循环比较直到成功或者达到一定的重试次数。
  3. 无锁:CAS操作不需要使用传统的锁机制,而是通过硬件的原子操作指令来实现。

CAS的实现原理如下:

  1. 首先获取要修改的变量的当前值。
  2. 然后与预期的值进行比较,如果相等,则说明没有其他线程修改该变量,可以进行更新操作。
  3. 如果不相等,则说明其他线程已经修改了该变量,CAS操作失败,需要重新获取当前值并重新比较。
  4. 如果比较成功,将新值写入变量,CAS操作完成。

CAS操作在并发环境下可以保证数据的一致性,但是也存在ABA问题,即在某些情况下,变量的值可能经过多次修改后又恢复到原来的值,这时CAS操作可能会误判。为了解决ABA问题,可以使用版本号、时间戳等方式进行扩展。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。