volatile的内存模型

本文探讨了Java中volatile关键字的作用及其与线程同步的关系,通过对比synchronized关键字,解释了如何利用volatile确保多线程环境下的数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于volatile关键字的使用,在之前理解上有一些偏差,今天看了一些关于它的资料,想和大家一起分享一下~~

之前学synchronized 的时候,就在书上看到介绍volatile,但是当时也是一知半解,当时的理解就是:当一个线程对volatile修饰的变量时,另一个线程对这个变量的修改结果是立即可见的;
这句话的本身表达没有什么问题,但是对这句话的理解和JVM对这个变量的具体操作是什么样的,只凭这句话很难理解的比较深刻。

1.线程同步

  相信很多人都知道,当存在多个线程并发时,要保证线程能够同步,就要保证操作的原子性,原子性就是指,CPU要执行这段代码时,要么不执行,要不就一次执行完。当这个操作一次执行完时,其他线程当然不会在这个线程执行的过程中进行打断。因此就能保证每一次执行这段代码时,都是对这段代码所涉及数据的一次完整的操作,因此数据能保证一致性
   synchronized 代码块和synchronized 修饰的方法就保证了操作的原子性(不理解的可以去其他的博客看看),下面我举一个用synchronized 的例子吧:

    public class VolatileTest {

        public static int race=0;

        public static void increase(){
        synchronized(VolatileTest.class){
            race++;
            }
    }

    private static final int THREADS_COUNT=20;

    public static void main(String[] args) throws InterruptedException {
        Thread[] threads = new Thread[THREADS_COUNT];
        for(int i=0;i<THREADS_COUNT;i++){
            threads[i]=new Thread(new Runnable() {
                public void run() {
                    for(int i=0;i<10000;i++){
                        increase();
                    }
                }
            });
            threads[i].start();
        }
        while(Thread.activeCount()>2) {
            Thread.yield();
        }
        System.out.println(race);
    }
}

简单介绍一下:

上面的例子中开启了20个线程,每个线程都会执行10000次increase()方法,由于increase()方法对race的操作用synchronized代码块修饰了,因此每个线程都能执行完整的1000次自增操作,因此结果为20000000。也可以把increase()方法改为

public synchronized static  void increase(){
        race++;
}

这是synchronized锁的两种使用方式。

再简单分析一下:如果不采用线程同步会造成什么样的后果,由于自增操作不是原子操作,因此当一个线程执行race操作时,其他线程也可能对其进行操作,在线程的并发环境下,如果不对变量进行加锁,可能会导致对变量的操作结果不是自己预期的情况。但是如果直接对变量加锁,又会引起锁的竞争,导致程序的只想效率降低,有人说Volatile的变量能够解决这个问题,其实不然,下面我们看一下在当对一个Volatile变量进行操作的时候,内存时如果进行读写的呢

未完待续,有时间补上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值