文章目录
二、并发编程的三大特性
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
- 因为 ++操作可以从指令中查看到

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

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.
Java并发编程三大特性:原子性、可见性与有序性详解,

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

被折叠的 条评论
为什么被折叠?



