java多线程编程------CAS

03-12 1180阅读

一、CAS的介绍

在JDK1.之前,java的多线程都是靠synchronized来保证同步的,这会引发很多性能问题,例如死锁。但随着Java的不断完善,JNI使得java能越过JVM直接调用本地方法,例如CAS。CAS ,它用于实现多线程同步的原子指令,允许算法执行读-修改-写的操作,而无须担心其他线程同时修改变量。

二.CAS的工作原理

CAS全称Cpmpare and swap,能够通过比较内存和寄存器的值是否相等,看是否要交换内存和另一个寄存器的值。

java多线程编程------CAS

上述比较,交换都是通过一条CPU指令来完成的,所以也就可以认为它是原子的。线程安全那一篇我们谈过,造成线程安全问题的第二点就是进行的操作不是原子的,我们通过加锁和给变量加volatile去解决这个问题的。而CAS本身已经是原子的,基于这点,那么他又给我们打开了另一扇大门,无锁编程。

三.CAS的运用

实现原子类

前面我们聊过多个线程同时访问同一个变量并且进行修改会触发线程安全问题,如果多个线程同时对某一个变量进行++操作那么必然造成线程安全问题。因为对某一个变量进行++,其中涉及,load,add,save,由于线程的抢占式的执行和不是原子性的操作导致结果出现偏差(在前几篇细讲过)。因此java标准库中提供了一组原子类。

java多线程编程------CAS

import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
public class java19 {
    public static AtomicInteger atomicInteger = new AtomicInteger();
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{
            for(int i=0;i
                atomicInteger.getAndIncrement();
            }
        });
        Thread thread1 = new Thread(()-{
            for(int i=0;i
                atomicInteger.getAndIncrement();
            }
        });
        thread.start();
        thread1.start();
        thread.join();
        thread1.join();
        System.out.println(atomicInteger);
    }
}
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]