Volatile不保证原子性案例分析

    技术2025-06-03  34

    Volatile不保证原子性案例 1.什么叫做原子性 原子性就是一件事情不可分割,需要保证完整性。言外之意就是某个线程在完成某件任务,是不可被打断,加塞的,是不可分割的。要么同事成功,要么同时失败。 2.Volatile不保证原子性案例 package com.example.demo;

    import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils;

    import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors;

    /**

    Created by Administrator on 2020/6/18. */ class VDemo { volatile int num;

    public void numUPlus() { num++; } }

    /**

    Volatile不保证原子性案例

    num默认为0 加Volatile的关键字

    num++在多线程环境下是不保证线程安全的 */ public class VolatileDemo { public static void main(String[] args) { VDemo vd = new VDemo(); for (int i = 0; i < 10; i++) { new Thread(() -> { for (int j = 0; j <2000 ; j++) { vd.numUPlus(); } }).start(); }

    //当上面计算完成之后,主线程得到num值进行输出,看结算结果为20000 while (Thread.activeCount()>2) { } System.out.println(Thread.currentThread().getName() + " end main number:" + vd.num);

    }

    } 3.如何解决Volatile不保证原子性问题 (1).加synchronized(不推荐) (2).使用JUC下面的AtomicInteger 案例: package com.example.demo;

    import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils;

    import java.util.*; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors;

    /**

    Created by Administrator on 2020/6/18. */ class VDemo { volatile int num;

    public void numUPlus() { num++; } AtomicInteger atomicInteger=new AtomicInteger(); public void addAtomic(){ atomicInteger.getAndIncrement(); } }

    /**

    Volatile不保证原子性案例

    num默认为0 加Volatile的关键字 */ public class VolatileDemo { public static void main(String[] args) { VDemo vd = new VDemo(); for (int i = 0; i < 10; i++) { new Thread(() -> { for (int j = 0; j <2000 ; j++) { vd.numUPlus(); vd.addAtomic(); } }).start(); }

    //当上面计算完成之后,主线程得到num值进行输出,看结算结果为20000 while (Thread.activeCount()>2) { } System.out.println(Thread.currentThread().getName() + " end main number:" + vd.num); System.out.println(Thread.currentThread().getName() + " AtomicInteger main number:" + vd.atomicInteger);

    }

    }

    Processed: 0.010, SQL: 9