并发的三大特性

128 阅读1分钟

1.原子性

原子性:在一个操作中,不能被其他操作中断,类似数据库事务的原子性,一个操作就是一个原子操作,保证了线程的安全和数据的可靠。

java内存模型定义了8个操作来完成主内存和工作内存的交互操作,需要注意的是,没有被volatile修饰的64位数据,会被分成2次32位操作,操作一半时可能被其他线程读取,造成结果错误。

下面是1000个线程同时对num执行自增操作的结果

image.png

image.png

1.1互斥锁

解决线程访问冲突过程,同步锁永远是最直接的方法,但阻塞比较消耗性能,非必要不推荐。

1.2原子类(Atomic)

使用AtomicInteger类型可以保证多线程下执行的原子性。

image.png

2.可见性

当一个线程修改了共享变量的值,其他线程能立即得知这个修改。

2.1

java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值来实现可见性的。

2.2实现方式

(1)volatile
(2)synchronized
(3)final,前提:不发生this逃逸

上述代码中只需要将num2类型添加volatile即可实现可见性

image.png

image.png

3.有序性

image.png