synchronize 关键字的理解

本文详细介绍了Java中`synchronize`关键字在实现线程同步、保证原子性操作、保护共享资源和避免竞态条件等方面的应用,包括同步实例方法、代码块和静态方法,以及实例化单例模式中的双重校验锁策略。
摘要由CSDN通过智能技术生成

简述

简单一句话:synchronize 关键字用于在 Java 中实现线程同步。

线程同步:线程同步是指控制多个线程访问共享资源的行为,确保在任意时刻只有一个线程可以访问共享资源,以避免数据不一致或竞态条件等问题。

在 Java 中,多线程环境下的线程同步可以通过 synchronize 关键字来实现,当一个方法或代码块被 synchronize 修饰时,它就成为了一个同步方法或同步代码块,同一时间只有一个线程可以执行其中的代码,其他线程需要等待执行。

synchronize 关键字的作用

  • 确保原子性操作

对于一些需要原子性操作的代码段,通过synchronize关键字可以确保整个操作在同一时间只被一个线程执行,避免了线程之间的干扰。

  • 保护共享资源

当多个线程需要访问共享资源时,通过同步机制可以确保在任意时刻只有一个线程可以修改该资源,从而避免了数据的不一致性。

  • 避免竞态条件

通过限制对共享资源的访问,可以避免竞态条件的发生,确保线程执行的可靠性和一致性。

使用方法

  • 同步实例方法

使用 synchronized 修饰普通的实例方法,确保同一时间只有一个线程可以访问该实例方法,锁定的是当前实例对象。

public class SynchronizeInstance {
    public synchronized void synchronizedInstanceMethod() {
        // 同步实例方法的代码
    }
}

  • 同步代码块

使用 synchronized 关键字将代码块包裹起来,确保同一时间只有一个线程可以执行该代码块,可以选择性地指定锁定的对象。

public class SynchronizeInstance {
    public void synchronizedStaticMethod() {
        synchronized (lockObject) {
            // 同步代码块的代码
        }
    }
}

  • 同步静态方法

使用 synchronized 修饰静态方法,确保同一时间只有一个线程可以访问该静态方法,锁定的是类的 SynchronizeInstanceClass 对象。

public class SynchronizeInstanceClass {
    public static synchronized void synchronizedStaticMethod() {
        // 静态同步方法的代码
    }
}

实践 - 双重校验锁

使用单例模式和 synchronized 关键字实现一个双重校验锁

public class Singleton {
    private static volatile Singleton INSTANCE;
    private Singleton() {}

    public static Singleton getInstance() {
        // 第一重校验,提高代码效率,如果已经实例化了则会直接返回
        if (INSTANCE == null) {
            synchronized (Singleton.class){
                /*
                 * 第二重校验,这里作个假设:有两个线程T1,T2
                 * 当T1进入了第一重校验,准备争抢资源时,T2先获取到了资源
                 * 此时INSTANCE == null是成立的,故T2进行了实例化,并释放了资源
                 * T1获取到了资源,它并不知道T2是否已经实例化了对象
                 * 所以需要进行第二重校验,确保只有一个实例被创建
                 */
                if (INSTANCE == null){
                    INSTANCE = new Singleton();
                }
            }
        }
        return INSTANCE;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这小鱼在乎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值