转载请注明原创出处,谢谢!

JAVA服务端或者后端需要大量的高并发计算,所以高并发在JAVA服务端或者后端编程中显的格外重要了。

首先需要有几个概念:

1.同步和异步

同步异步是来形容方法的一次调用的,同步必须等等方法调用结束后才可以继续后续的操作,而异步方法调用就会返回(真正的执行一般在另外一个线程中)就可以继续后续操作了。

2.并发和并行

这两个概念都是表示2个或者多个任务一起执行,而并发侧重的是多任务交替执行,就是一个时间点就只有一个任务(时间碎片很小),而并行是真正意义的同时执行(某个时间碎片有大于1个任务在执行)。

3.临界区

临界区这个概念非常重要,就是多个线程都会操作到的,是一个公共资源或者共享的数据,但是每次操作只能一个线程使用而一旦临界区资源被占用其他的线程必须等待该资源的释放,在并行程序中,临界区资源都是受保护的,如果不保护就会出现问题,达不到预期的效果。

4.阻塞和非阻塞

阻塞和非阻塞是形容多个线程之间的相互影响的(前提是多个线程而不是一个),一个线程占用了临界区资源那么其他线程必须在临界区之外等待,阻塞是操作系统层面挂起,上下文切换了,所以性能不高。阻塞如果一个线程一直占用不释放资源,那么其他需要该临界区资源都必须一直等。非阻塞就是运行多个线程同时进入临界区,只要保证不把数据修改坏就行。

由于临界区的存在,多线程并发必须受到控制。
根据控制并发的策略,大概可以分为一下几种:
阻塞、无饥饿、无障碍、无锁、无等待。

  • 阻塞上面已经解释了。

  • 由于线程直接的具有优先级,如果线程调度会优先调用优先级高的,那么优先级低的可能一直无法执行,就会饥饿,如果锁是公平的,都是按照新进先出就不存在饥饿了就是无饥饿。

  • 无障碍,阻塞其实是悲观锁,就是多线程一起修改临界区数据可能会被修改坏,所以每次只能一个人进行修改,其他需要等待,而无障碍的表示的一种非阻塞调度,他是一种乐观锁,他任务多个线程一起修改临界区数据也未必会把临界区数据修改坏,所以可以放开让多线程都进来,一种宽进严出的策略。如果发现一个线程在临界区操作遇到数据竞争,产生冲突,他就会回滚操作,进行重试,可能会出现死锁的情况 a依赖b b依赖a 都不断重试。

  • 无锁,是在无障碍的前提上面加一个约束,就是保证有一个线程可以胜出的,可能存在饥饿问题。

  • 无等待,是在无锁的前提上面加一个约束,就是保证所有线程都可以在有限步内完成。

JAVA的内存模型(JMM),由于并发程序比串行程序复杂很多,在并发程序下,数据访问一致性和安全性该如何保证呢?所以还需要在定义一些规则,保证多线程之间可以有效地、正确地协同工作,而JMM就是为此而生的。

JMM关键技术点都是围绕多线程的原子性、可见性、有序性来建立的。

关于JMM的原子性、可见性、有序性后续并发系列都会详细解释。


个人公众号

最新文章

  1. asp.net mvc 验证码
  2. Python的文件操作
  3. How the problem solved about " Dealing with non-fast-forward errors"
  4. Unity3D游戏引擎最详尽基础教程
  5. CLIQUE 聚类算法以及Java实现+多线程
  6. Machine Learning : Pre-processing features
  7. (转)iOS应用程序生命周期(前后台切换,应用的各种状态)详解
  8. C++视频课程小结(2)
  9. 05顺序队列_Queue--(栈与队列)
  10. 哈希(2) hash索引
  11. 手机Web网站,设置拒绝电脑访问
  12. svn代码版本管理
  13. HTML5表单提示placeholder属性兼容IE
  14. 如何测试LBS功能
  15. Memcached【第一篇】安装
  16. Python练手例子(3)
  17. 微信内转发APP及h5类域名怎么做到防封防拦截,微信域名防红技术原理
  18. [PHP] PHP在CLI环境下的错误日志
  19. Git同步远程fork的项目
  20. 考前停课集训 Day5 累

热门文章

  1. Qt Installer Framework的学习(二)
  2. adb logcat 使用
  3. JSP从选择到放弃
  4. 26.使用IntelliJ IDEA开发Java Web项目时,修改了JSP后刷新浏览器无法及时显示修改后的页面
  5. assert增强宏的实现
  6. Rabin-Karp 算法
  7. Unity 3D 开发 —— 脚本编程
  8. VMwarep挂载镜像及配置本地Yum源
  9. java 参数
  10. RK3066 实现LED闪烁的代码分析