Java多线程并发编程系列-02 并发编程的三大特性:原子性、可见性、有序性

Java并发编程三大特性:原子性、可见性与有序性详解,
本文详细介绍了Java并发编程中的三大特性:原子性、可见性和有序性,包括synchronized、CAS、Lock、ThreadLocal等同步机制,以及volatile关键字和happens-before规则的应用。

二、并发编程的三大特性

1 原子性

1.1 什么是原子性

  • JMM(Java Memory Model)。不同的硬件和不同的操作系统在内存上的操作有一定的差异,Java 为了解决相同代码在不同操作系统上出现的各种问题,用 JMM 屏蔽掉各种硬件和操作系统带来的差异,让 Java 的并发编程可以做到跨平台。
  • JMM 规定所有变量都会存储在主内存中,在操作的时候,需要从主内存中复制一份到线程内存(CPU内存),在线程内部做计算,然后回写到主内存中(不一定!!)
  • 原子性的定义:原子性是指一个操作是不可分割的、不可中断的,一个线程在执行时,另一个线程不会影响到它。
  • 并发编程的原子性用代码阐述:
private static int count;
public static void main(String[] args) throws InterruptedException {
   
   
    Thread t1 = new Thread(() -> {
   
   
        for (int i = 0; i < 100; i++) {
   
   
            increment();
        }
    });
    Thread t2 = new Thread(() -> {
   
   
        for (int i = 0; i < 100; i++) {
   
   
            increment();
        }
    });
    t1.start();
    t2.start();
    t1.join();
    t2.join();
    System.out.println(count);
}
private static void increment() {
   
   
    try {
   
   
        Thread.sleep(10);
    } catch (InterruptedException e) {
   
   
        e.printStackTrace();
    }
    count++;
}
  • 当前程序,多线程操作共享数据时,预期的结果与最终的结果不符。
  • 原子性:多线程操作临界资源,预期结果与最终结果一致。
  • 通过这个程序的分析,可以查看出,++ 操作一共分为三步:① 线程从主内存拿到数据并保存到 CPU 的寄存器中,② 在寄存器中进行 +1 操作,③ 最终将结果写回到主内存中。

1.2 怎么保证原子性

1.2.1 synchronized
  • 因为 ++操作可以从指令中查看到

image.png

  • 可以在方法上追加 synchronized 关键字或者采用同步代码块的形式来保证原子性。synchronized 可以避免多线程同时操作临界资源,在同一时间点,只会有一个线程正在操作临界资源。

image.png

1.2.2 CAS

什么是CAS?

  • CAS 即 Compare And Swap 也就是比较和交换,是一条 CPU 的并发原语。
  • 它在替换内存的某个位置的值时,首先查看内存中的值与预期值是否一致,如果一致,那么执行替换操作,这个操作是一个原子操作。
  • Java中基于Unsafe类提供了对 CAS 操作的方法,JVM会帮助我们将方法实现 CAS 汇编指令。但是要清楚 CAS 只是比较和交换,在获取原值的这个操作上,需要自己实现。
private static AtomicInteger count = new AtomicInteger(0);
public static void main(String[] args) throws InterruptedException {
   
   
    Thread t1 = new Thread(() -> {
   
   
        for (int i = 0; i < 100; i++) {
   
   
            count.incrementAndGet();
        }
    });
    Thread t2 = new Thread(() -> {
   
   
        for (int i = 0; i < 100; i++) {
   
   
            count.incrementAndGet();
        }
    });
    t1.start();
    t2.start();
    t1.join();
    t2.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

讲文明的喜羊羊拒绝pua

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

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

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

打赏作者

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

抵扣说明:

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

余额充值