Java并发编程

记录Java并发编程的知识,包括并发编程的详细介绍,并发编程解决的问题,volatile关键字,各种锁机制,synchronized的底层原理,CAS机制,AQS机制,以及JUC里面常见方法


一、什么是并发编程

在计算机里面有并发与并行的概念;当我们完成一件事情的时候,我们一定对完成这件事情的时间与效率很关心;当我们使用计算机去执行命令帮助我们完成一件事情也是一样的,我们希望计算机高效的完成;根据冯诺依曼计算机模型我们可以知道计算机大体组成是:运算器,控制器,存储器,输入设备,输出设备。计算机发展过程中CPU承担了运算器与控制器的作用,内存与外存承担了存储器的功能,我们现在需要从CPU与内存,磁盘存储(外存)三者进行分析:CPU现在性能强劲,计算速度很快;内存相对于外存来讲,速度是快的,但是与CPU运算速度进行比较的话就慢了;为了缓解这三者之间的速度差异,我们使用了缓存;从外存获取必要的数据资源信息到内存,CPU从内存中获取必要的数据资源;从多核CPU进行分析,每个CPU都有属于自己的工作内存,所有这些CPU又共享一块工作内存,每个CPU是不可以访问其他CPU的工作内存的,当他们将数据在直接的工作内存中处理完毕就会将数据写入到所有CPU共享的工作内存,最后写入到我们的外存中;这个过程让CPU减少了访问外存的次数,提高了执行效率;但是也带来了问题:多个CPU同时刻分别执行任务,这就是并行的概念;单个CPU在一个时间段内分别执行任务就是并发的概念;并行是提高执行速率的一个关键,也是带来问题的关键

在单个CPU执行任务的时候会出现并发的现象,也就意味着CPU有可能不会等一个线程执行完毕就让出执行权,这种情况就是出现了非原子性;因为每个CPU都有只属于自己的一块工作内存,其他CPU无法访问,在某种情况下就会出现数据不一致;如:现在有两个CPU都从共享的工作内存空间读取到num=0,此时CPU1将num数值改为1,此时CPU2也将num数值改为1,现在两个CPU都需要把num的值写会到内存中,但是CPU1先进行写入内存操作,之后CPU2才执行,此时的实际结果是num的值是1;但是我们需要的结果是num=2;这与我们期望结果不一致;这也就是导致的第二个问题,不可见性;由于CPU执行的时候会将指令的顺序进行重新排序(编译优化),所以CPU实际执行的指令顺序与我们的代码顺序可能是不一致的,但是有一些业务逻辑我们是不希望让这种不一致出现的;这也就导致了第三个问题,非有序性

我们的并发编程就是围绕着解决这三个问题去展开的

从计算数据结果去分析,其实是因为:在解决CPU,内存,磁盘之间读写速度差异大,提高计算机效率的时候,引入了缓存,线程,并发,并行的思想之后带来了新问题,不管是非原子性,不可见性,还是非有序性,它们三者最终导致的问题都是程序对内存中数据操作结果达不到预期目标


二、volatile关键

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未来是会发光的️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值