当前位置: 首页 > 后端技术 > Java

Java并发编程系列之一并发理论基础

时间:2023-04-01 14:34:25 Java

Java并发编程系列之一并发理论基础本系列文章开启了Java并发编程进阶的学习。前置知识会介绍一些基础章节的内容,让新手能够顺利入戏。多线程学习真正的难点不在于多线程程序的逻辑有多复杂,而在于理清J.U.C包中各个多线程工具类之间的关系、特点和使用场景。学习应该是从整体到部分,从高层次开始,这对学习任何知识都是至关重要的。站在上帝的视角,用全局的眼光,深入到每一个并发编程的封装和API的底层实现。概述下图展示了并发编程涉及的所有知识。读者一般浏览各个包和实现类,以做到心中有数。毫无疑问,JUC是并发编程的核心内容,也是我们这篇文章的重点。让我们看看JUC包下的所有内容。JUC即java.util.concurrent,利用多线程大大提高了CPU的利用效率。凡事有利有弊,那么多线程的使用会带来哪些问题呢?多线程引起的问题使用多线程会引起并发问题。如果多个线程在没有同步操作的情况下访问同一个共享数据,操作的结果将不一致。如果张三、李四、王二代表三个线程,大哥只有一个钱包,钱还没到账张三就提款了,李四又提款了,导致数据不一致。怎么会出现这样的问题?根本原因是CPU、内存和I/O设备的速度差别很大。为了合理利用CPU的高性能,平衡三者之间的速度差异,计算机体系结构、操作系统、编译器都做出了改变。贡献主要体现在:CPU增加了缓存以平衡与内存的速度差异;//导致可见性问题操作系统通过添加进程和线程对CPU进行时分多路复用,进而平衡CPU和I/O设备的速度差异;//造成原子性问题,编译器优化指令的执行顺序,让缓存更合理的使用。//导致顺序的问题可见性、原子性、顺序是并发的三要素。张三的提款是不同步到账户的,就是可见性的问题。让我们专注于有序性。诠释我=0;布尔标志=false;i=1;//语句1flag=true;//上面语句2的代码定义了一个int类型变量,定义了一个boolean类型变量,然后分别给两个变量赋值操作。从代码顺序来看,statement1在statement2之前,那么JVM在真正执行这段代码的时候,会保证statement1先于statement2执行吗?不一定,为什么?排序(指令重新排序)。为了在执行程序时提高性能,编译器和处理器经常对指令进行重新排序。共有三种类型的重新排序:编译器优化的重新排序。编译器可以在不改变单线程程序语义的情况下重新安排语句的执行顺序。用于重新排序的指令级并行性。现代处理器使用指令级并行(ILP)来重叠和执行多条指令。如果没有数据依赖,处理器可以改变语句对应机器指令的执行顺序。内存系统的重新排序。由于处理器使用高速缓存和读/写缓冲区,这使得加载和存储操作看起来是乱序执行的。从Java源代码到最终实际执行的指令序列,将分别经历以下三种重排序:1属于编译器重排序,2、3属于处理器重排序。这些重新排序会导致多线程程序中的内存可见性问题。并发性存在问题,由语言设计者来解决。JAVA是如何解决并发问题的?既然多线程存在这三个问题,Java就需要解决这三个问题。1、对于原子性,Java内存模型只保证基本的读取和赋值是原子操作。如果想实现更大粒度的原子性,可以使用synchronized和Lock来实现。2、为了可见性,Java提供了volatile关键字来保证可见性。当一个共享变量被volatile修改时,它会保证修改后的值会立即更新到主存中,当其他线程需要读取它时,它会去内存中读取新的值,也可以通过synchronized和Lock来保证可见性。Synchronized和Lock可以保证同一时刻只有一个线程获取到锁然后执行同步代码,并且在释放锁之前会将变量的修改刷新到主存中。3.为了有序性,使用happens-before原则,让一个操作先于另一个操作完成,不受控制。JUC的出现本质上就是为了解决这些问题,当然这是后话了。如何避免并发问题?不可变(Immutable)对象必须是线程安全的,不需要采取任何线程安全措施。只要正确构造了不可变对象,它就永远不会在多个线程中处于不一致状态。在多线程环境下,应该尽量使对象不可变,以满足线程安全。final关键字修饰的基本数据类型String枚举类型Number的一些子类,如Long、Double等数值封装类型,BigInteger、BigDecimal等大数据类型。但是原子类AtomicInteger和AtomicLong都是可变的,它们都是Number。对于集合类型,您可以使用Collections.unmodifiableXXX()方法来获取不可变集合。今天的并发编程基础理论知识就到这里了。主要引出为什么要使用多线程,使用多线程会带来哪些问题以及如何解决这些问题的理论知识。下一部分将介绍如何在java中使用多线程。

猜你喜欢