美文网首页
2019-04-27 Java 并发编程知识梳理

2019-04-27 Java 并发编程知识梳理

作者: 竹blue | 来源:发表于2019-04-28 00:13 被阅读0次

    并发编程的由来

     大家知道CPU 、内存、I/O设备的运行速度是坠崖式下降的。所以这就造成了当I/O设备在拉去资源时,CPU或内存是处于空闲状态,而程序中的语句大部分要访问内存,甚至有的还要去访问I/O设备,这就不可避免是的CPU处于空闲状态,而程序运行的快慢是有整体中最慢的设备运行速度决定的。进而为了合理的利用CPU的高性能,平衡三者之间的利用率,在计算机体系机构、操作系统、编程程序进行了优化。
     具体体现:
      1. CPU增加缓存,以均衡和内存的速度差异;
      2. 操作系统增加进程,线程来分时复用CPU,进而均衡和I/O设备的速度差异;
      3.编译优化程序的执行指令,使其更合理的利用CPU的缓存;

    并发编程Bug的源头

    • 可见性
    • 原子性
    • 有序性

    \color{red}{缓存}导致的可见性问题

    可见性:一个线程对某资源的操作对其他线程是可见的。如下代码线程T1将对象Person的age修改为‘18’对线程T2是可见的。

    @Date
    public class Person{
      private String name;
      private String age;
      private Integer sex;
    }
    

    \color{red}{线程切换}带来的原子性问题

    原子性:我们把一个或多个操作在CPU上执行而不被中断的特性称为原子性。

    注意:CPU只能保证CPU级别的原子操作,而无法保证程序语句的在CPU执行的原子操作。

    \color{red}{编译优化}带来的有序性问题

    有序性:程序按照代码的先后顺序执行,而编译器在不影响最终结果的情况下为了优化性能,有时候会改变程序实际执行的顺序,这个时候如果在多线程运行环境中可能导致并发bug发生。

    总结

     写好并发编程,首先要知道并发程序可能出现问题的地方,只有知道bug可能才出现的地方才能有的放矢,才能写出健壮的并发程序。(\color{red}{PS}:此次写的比较粗糙很多都没有流程图或者代码实例进行详细说明,后期和进行添加,谢谢大家的支持🙏。)

    相关文章

      网友评论

          本文标题:2019-04-27 Java 并发编程知识梳理

          本文链接:https://www.haomeiwen.com/subject/vhnlnqtx.html