volatile与synchronized

简介: volatile与synchronized

作者其他链接

正则表达式-CSDN博客

“低代码开发:美味膳食还是垃圾食品?“-CSDN博客

volatile和synchronized是Java语言中两个重要的关键字,它们都涉及到并发编程的概念,对于保证多线程程序的正确性非常重要。在这篇博客中,我们将从基础开始讲解这两个关键字,包括它们的含义、使用场景、实现原理等方面,帮助大家更好地理解和应用它们。

一、volatile关键字

  1. 含义

volatile是Java语言中的一个关键字,它表示一个变量是易变的,不能被缓存,并且在多线程环境下需要实时同步。简单来说,volatile关键字可以确保多个线程可以正确地共享和访问变量。

  • 可见性(Visibility): 当一个线程修改共享变量时,其他线程能够立即看到修改的结果。
  • 禁止指令重排序:volatile关键字能够防止编译器对指令进行重排序,确保指令按照预期顺序执行。
  1. 使用场景

在多线程环境下,如果多个线程需要共享一个变量,并且该变量的值需要在多个线程之间保持一致性,那么就需要使用volatile关键字。例如,一个计数器变量,多个线程对它进行加1操作,如果没有使用volatile关键字,就可能导致计数器值不正确的问题。

  1. 实现原理

volatile关键字的主要实现原理是禁止CPU缓存和禁止指令重排。禁止CPU缓存可以确保多个线程看到的变量值是一致的;禁止指令重排可以确保多个线程的操作顺序不被改变。具体来说,volatile关键字会通过JVM的内存模型来实现这些功能。

public class VolatileExample {
    private volatile boolean flag = false;
    public void setFlagTrue() {
        flag = true;
    }
    public void printFlag() {
        while (!flag) {
            // 等待flag变为true
        }
        System.out.println("Flag is now true.");
    }
}

二、synchronized关键字

  1. 含义

synchronized是Java语言中的另一个关键字,它表示一个方法或者代码块在执行时需要被锁定,以确保同一时刻只有一个线程可以执行该方法或者代码块。简单来说,synchronized关键字可以避免多个线程同时访问同一个方法或者代码块的情况。

  • 互斥性(Mutual Exclusion): 同一时刻只允许一个线程进入被synchronized修饰的代码块或方法。
  • 可重入性(Reentrancy): 线程可以重复获得已经持有的锁,避免死锁情况。
  1. 使用场景

在多线程环境下,如果某个方法或者代码块需要被多个线程访问,但是同时只有一个线程可以执行该方法或者代码块,那么就需要使用synchronized关键字。例如,一个银行账户的存款和取款操作需要保证原子性,即同时只能有一个线程操作该账户,那么就可以使用synchronized关键字来保证原子性。

  1. 实现原理

synchronized关键字的主要实现原理是利用对象锁或者内置锁来保证方法或者代码块的原子性。当一个线程执行一个synchronized方法时,会获取该对象的锁,其他线程则会被阻塞,直到获取到锁的线程执行完毕释放锁。如果synchronized修饰的是代码块而不是方法,则会使用内置锁来保证原子性。

public class SynchronizedExample {
    private int count = 0;
    public synchronized void increment() {
        count++;
    }
}

三. volatilesynchronized的对比

3.1 使用场景

  • volatile 适用于变量的简单读取和赋值操作,不能替代synchronized用于复合操作的原子性保证。
  • synchronized 适用于复合操作,确保一系列操作的原子性,同时提供了对临界区的互斥访问。

3.2 性能

  • volatilesynchronized轻量,适用于频繁读取的场景。
  • synchronized 操作相对较重,适用于复合操作较多的场景。

四、总结

在多线程编程中,volatilesynchronized是两个重要的关键字,各自在不同场景下发挥作用。正确地理解和使用这两个关键字,可以有效提高多线程程序的性能和稳定性。希望通过本文的介绍,读者能够更深入地理解这两个关键字的原理和用法。


相关文章
|
11月前
|
缓存 Java 编译器
|
缓存 安全 Java
Java并发编程中的四个关键字:ThreadLocal、Volatile、Synchronized和Atomic
Java并发编程中的四个关键字:ThreadLocal、Volatile、Synchronized和Atomic
234 0
java多线程关键字volatile、lock、synchronized
volatile写和volatile读的内存语义: 1. 线程A写一个volatile变量,实质上是线程A向接下来将要读这个volatile变量的某个线程发出了(其对共享变量所在修改的)消息。 2. 线程B读一个volatile变量,实质上是线程B接收了之前某个线程发出的(在写这个volatile变量之前对共享变量所做修改的)消息。 3. 线程A写一个volatile变量,随后线程B读这个volatile变量,这个过程实质上是线程A通过主内存向线程B发送消息。
266 0
|
存储 缓存 人工智能
volatile(三)
volatile 这个关键字大家都不陌生,这个关键字一般通常用于并发编程中,是 Java 虚拟机提供的轻量化同步机制,你可能知道 volatile 是干啥的,但是你未必能够清晰明了的知道 volatile 的实现机制,以及 volatile 解决了什么问题,这篇文章我就来带大家解析一波。
volatile(三)
|
存储 缓存 算法
volatile synchronized cas
之前写了《熔断》,以及其中使用的《计数器算法》;本来是要接着再写不通过定时器清理计数环的计数器算法,看了下我司亿级网关的计数器,百行的代码,但却是满满bug。不得穿插一下并发的基础知识 处理并发,最基本的元件就这三样 1. synchronized 这个关键字不必讲,从开始多线程,它就进入你的视线 2. volatile 在jdk5之后大放异彩 3. cas 在J.U.C中大量使用,他与volatile组合是J.U.C的基石
130 0
volatile synchronized cas
|
Java 编译器
volatile与synchronized 区别
volatile与synchronized 区别
105 0
|
存储 缓存 安全
synchronized&volatile (二)
synchronized&volatile (二)
179 0
|
SQL 存储 算法
volatile详解
在单线程环境中,我们几乎用不到这个关键词,但是多线程环境中,这个关键词随处可见。而且也是面试的常客。总的来说,volatile有以下三个特性: 保证可见性; 不保证原子性; 禁止指令重排。 下面就来详细的说说这三个特性。
volatile详解
|
缓存 安全 Java
volatile(二)
volatile 这个关键字大家都不陌生,这个关键字一般通常用于并发编程中,是 Java 虚拟机提供的轻量化同步机制,你可能知道 volatile 是干啥的,但是你未必能够清晰明了的知道 volatile 的实现机制,以及 volatile 解决了什么问题,这篇文章我就来带大家解析一波。
volatile(二)