编发编程之原子性

88 阅读2分钟

编发编程原子性

编发编程3大特性

1、可见性

2、顺序性

3、原子性

概念解释

race condition 竞争条件

多个线程访问同一个资源,发送的竞争

数据不一致性

竞争条件引发的结果,可能会出现数据的不一致性

解决数据一致性机制-锁机制

线程同步,保证线程的执行是顺序的

原子操作

线程不会被打断的操作,即为原子操作。

java的8个原子操作

lock 、unlock 、read 、load 、use 、assign 、store 、write

monitor

monitor 在CPU 层面叫管程。也叫锁。

critical section 临界区

在上锁里面执行的所有代码。

消耗的时间越长,则锁的粒度越大;反之,时间越少,锁的粒度越小。

悲观锁

认定一定会被其他线程打断,加上锁,才能保证原子性。

synchronized 是悲观锁 。

乐观锁

不会被其他线程打断。

乐观锁,也被叫做无锁,自旋锁,CAS操作。这些指的都是一个概念。

如何保证线程的顺序访问

线程同步,也叫上锁。 java的synchronized 锁。

synchronized 可以保证线程的可见性和原子性,但不能保证线程的顺序性。

锁的本质

锁的本质是保证并发执行的顺序性。并发执行的序列化。

CAS 操作

cas , compare and swap

什么是CAS 操作

有个变量N 当前值是A,要把他改成B,在cas操作时候,先读出当前值N=A,判断当前是A则改成B,如果当前值不是A,则重新来一次,读取出N的值,假设是C,在cas时候判断N是否等于C,如果等于则把N改变为B。

CAS 操作的 ABA 问题

多个线程参与的情况下,T1线程读到的是A,在之前CAS操作之前,有线程T2,把值改成了B,又改成了A。此时T1线程是不知道它发生了变化,依然执行把A改成B。

在某些应用场景下,

ABA 问题的解决方案

1、 加版本号 version 。

2、使用Automic类型操作

缓存行锁和总线锁

寄存器和内存

要操作数据,需要把数据从内存中取出来,放到寄存器中,在寄存器中操作;操作完,要把数据从寄存器写入到内存中。

在整个读写操作过程中,设计了高效缓存,就是我们常说的,CPU的三级缓存。