Java并发基础——核心篇

Java并发基础之核心篇

上一期介绍了基础理论,让大家对并发有了基本的概念,这期也是并发理论的核心内容。

核心概念

共享性

数据的共享是并发安全的关键原因。

线程之间如果数据是隔离的话,那么也就不存在并发安全的问题。我们常常不关心并发安全的问题,是因为很多时候数据是在单一线程内产生、使用直到消亡。即使是线程管理也由服务中间件(Tomcat、Jetty等)完成的,所以平时工作中很少关注并发安全的问题。

互斥性

并发操作的互斥是并发安全的主要手段。

线程之间如果数据是共享的话,那么想达到并发安全,就需要通过互斥的并发操作来保证并发安全。当多个线程对相同的共享数据操作时,保证操作的共享数据没有被同时写入、修改等操作。

原子性

并发操作的原子性,是保证并发安全的重要因素。

并发操作如果是都是原子性的,那么也可以保证并发安全,比如说AtomicInteger等工具类,提供了一系列的具有原子特性的操作方法。

可见性

共享数据的可见性是一个相对不容理解的概念,需要对计算机组成原理有一些了解。

简单介绍一下CPU与内存之间交互原理,每个CPU核心都有自己的缓存空间,当CPU需要处理内存中的数据时,就要从内存把数据同步到缓存中,当然内存中的数据是共享的,所以CPU处理之后的缓存数据还没有及时刷新到内存中,那么这个修改后的数据对于其他核心(可以理解为线程)就是不可见的。

有序性

为了提升性能,JVM会对指令重排序,这回导致并发编程的结果不符合预期,这样就会导致并发问题,所以指令的有序性也是并发安全的一个重要指标。

  • 编译器重排序,会在不改变单一线程中程序预期结果的前提下,进行执行语句的重排序。
  • 指令集重排序,在不存在数据依赖的情况下处理可以改变执行语句对应机器指令的执行顺序
  • 内存重排序,由于CPU、高速缓存和主内存之间存在一个同步问题,那么加载和存储操作可能是乱序的。

所以如果保证操作的有序性也可以间接保证并发的安全性。

总结

这期给大家介绍了这些特性,相对并发来说是比较核心的,之后对于并发相关的内容介绍都会围绕这些特性来说,希望对大家会有帮助。

请大家多多关注,多多交流。

你可能感兴趣的:(Java并发基础——核心篇)