[Java 并发]跳出来,看全貌

Java 并发这块,比较难,为啥呢,因为这一个知识点,那一个知识点的,特别碎
所以这个时候最重要的就是要对 Java 并发这块的知识有一个全貌
我先上一张图,下面的内容主要就是围绕这张图来说:

在这里插入图片描述

主要矛盾

凡事都有它的发展规律, Java 并发也是如此,不可能说突然这个事物就出来了
那为什么会有并发编程呢?这就要说一说 CPU/内存/磁盘 它们之间的速度差异了
应该都知道 CPU 的速度非常快,比内存的速度还要快,如果拿"天上一天,地上一年"来比喻 CPU 和内存之间的差异我觉得也是很合适的.内存的速度又要比磁盘的速度要快,快的量级是十倍都不止,那么可想而知, CPU 的一天,对于磁盘来说可能就是十年了.

怎么办呢?既然 CPU 这么快,那就用一用 CPU 缓存嘛,我先把一些数据放在 CPU 缓存中,这样是不是读取的速度就快一些;在操作系统层面,增加进程/线程,这样如果这个线程不用 CPU 了,赶紧换另外一个线程使用;编译程序在进行编译的时候,可以将指令进行一下优化
这样看起来是不错,但是它们分别带来了不同的问题.比如 CPU 缓存这一块,缓存最大的问题是什么?是数据不一致问题,源数据都已经做了更新,但是在 CPU 缓存中没有去做这个更新,此时别的程序来读,就很容易导致可见性问题;操作系统增加了进程/线程,那么线程之间的切换就没有办法导致原子性问题,比如经典的 i++ ;编译器不是会对指令进行优化吗,那就没办法保证优化之后的结果还是原来的执行顺序,这就导致了有序性问题

JMM

有问题就要有解决方案嘛, JMM 的存在就解决了可见性和有序性的问题,怎么解决的呢?
这就要说, Happens-Before 规则, volatile , synchronized , final 这些内容了.
以前写过一些这部分的内容,就直接放链接了:
[Java 并发]为什么会有重排序?和 happens-before 有啥关系
[Java 并发]你确定你了解 volatile ?
[Java 并发]深入浅出 synchronized 与锁

核心

并发编程的核心主要有 3 点:

  • 分工
    因为是多线程嘛,那就肯定要分工好咯,就像一个团队,这个功能你来开发,那个功能他来开发,如果两个人开发同样一个任务,那不就有点儿浪费资源了嘛
    在并发编程这块,分工就是由 Executor/线程池/Fork/Join 来实现的
  • 协作
    分工好了,接下来就是怎么互相协作一起做好,协作的核心技术是管程,其实分工里面就有协作的解决方案,比如 Fork/Join 它就有定义分工完了怎么再协作,所以导图就没有列出,主要说了 CountDownLantch/CyclicBarrier/Monitor ,因为接下来我想针对这几个方面去写几篇文章(不偷懒的话;
  • 互斥
    分工/同步主要说的是性能,但是在并发程序里面还要求正确,也就是"线程安全",解决这个问题的核心就是互斥.
    解决互斥的方案就是锁嘛.所以就有无锁和互斥锁两种方案.具体可以见思维导图

思维导图里面涉及到的内容,接下来我会慢慢都写出来(就是不确定什么时候写完
有时候我觉得自己扎到细节里面去之后,就不知道在做什么了,需要再看看全貌,也就是这张导图
也算是对自己接下来要写的内容的一个总结吧

最后推荐几篇文章,相信你看完再看这个导图会有不小的收获

文章推荐:

以上,非常感谢您的阅读~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值