系统学习java高并发系列一
转载请注明原创出处,谢谢!
JAVA服务端或者后端需要大量的高并发计算,所以高并发在JAVA服务端或者后端编程中显的格外重要了。
首先需要有几个概念:
1.同步和异步
同步异步是来形容方法的一次调用的,同步必须等等方法调用结束后才可以继续后续的操作,而异步方法调用就会返回(真正的执行一般在另外一个线程中)就可以继续后续操作了。
2.并发和并行
这两个概念都是表示2个或者多个任务一起执行,而并发侧重的是多任务交替执行,就是一个时间点就只有一个任务(时间碎片很小),而并行是真正意义的同时执行(某个时间碎片有大于1个任务在执行)。
3.临界区
临界区这个概念非常重要,就是多个线程都会操作到的,是一个公共资源或者共享的数据,但是每次操作只能一个线程使用而一旦临界区资源被占用其他的线程必须等待该资源的释放,在并行程序中,临界区资源都是受保护的,如果不保护就会出现问题,达不到预期的效果。
4.阻塞和非阻塞
阻塞和非阻塞是形容多个线程之间的相互影响的(前提是多个线程而不是一个),一个线程占用了临界区资源那么其他线程必须在临界区之外等待,阻塞是操作系统层面挂起,上下文切换了,所以性能不高。阻塞如果一个线程一直占用不释放资源,那么其他需要该临界区资源都必须一直等。非阻塞就是运行多个线程同时进入临界区,只要保证不把数据修改坏就行。
由于临界区的存在,多线程并发必须受到控制。
根据控制并发的策略,大概可以分为一下几种:
阻塞、无饥饿、无障碍、无锁、无等待。
阻塞上面已经解释了。
由于线程直接的具有优先级,如果线程调度会优先调用优先级高的,那么优先级低的可能一直无法执行,就会饥饿,如果锁是公平的,都是按照新进先出就不存在饥饿了就是无饥饿。
无障碍,阻塞其实是悲观锁,就是多线程一起修改临界区数据可能会被修改坏,所以每次只能一个人进行修改,其他需要等待,而无障碍的表示的一种非阻塞调度,他是一种乐观锁,他任务多个线程一起修改临界区数据也未必会把临界区数据修改坏,所以可以放开让多线程都进来,一种宽进严出的策略。如果发现一个线程在临界区操作遇到数据竞争,产生冲突,他就会回滚操作,进行重试,可能会出现死锁的情况 a依赖b b依赖a 都不断重试。
无锁,是在无障碍的前提上面加一个约束,就是保证有一个线程可以胜出的,可能存在饥饿问题。
无等待,是在无锁的前提上面加一个约束,就是保证所有线程都可以在有限步内完成。
JAVA的内存模型(JMM),由于并发程序比串行程序复杂很多,在并发程序下,数据访问一致性和安全性该如何保证呢?所以还需要在定义一些规则,保证多线程之间可以有效地、正确地协同工作,而JMM就是为此而生的。
JMM关键技术点都是围绕多线程的原子性、可见性、有序性来建立的。
关于JMM的原子性、可见性、有序性后续并发系列都会详细解释。
个人公众号
系统学习java高并发系列一的更多相关文章
- 系统学习java高并发系列三
转载请注明原创出处,谢谢! 首先需要说说线程安全?关于线程安全一直在提,比如StringBuilder和StringBuffer有什么区别? 经常就会出现关于线程安全与线程非安全,可能一直在提自己没有 ...
- 系统学习java高并发系列二
转载请注明原创出处,谢谢! 什么是线程? 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程 ...
- java高并发系列 - 第22天:java中底层工具类Unsafe,高手必须要了解
这是java高并发系列第22篇文章,文章基于jdk1.8环境. 本文主要内容 基本介绍. 通过反射获取Unsafe实例 Unsafe中的CAS操作 Unsafe中原子操作相关方法介绍 Unsafe中线 ...
- java高并发系列-第1天:必须知道的几个概念
java高并发系列-第1天:必须知道的几个概念 同步(Synchronous)和异步(Asynchronous) 同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后, ...
- java高并发系列 - 第6天:线程的基本操作
新建线程 新建线程很简单.只需要使用new关键字创建一个线程对象,然后调用它的start()启动线程即可. Thread thread1 = new Thread1(); t1.start(); 那么 ...
- java高并发系列 - 第12天JUC:ReentrantLock重入锁
java高并发系列 - 第12天JUC:ReentrantLock重入锁 本篇文章开始将juc中常用的一些类,估计会有十来篇. synchronized的局限性 synchronized是java内置 ...
- java高并发系列 - 第16天:JUC中等待多线程完成的工具类CountDownLatch,必备技能
这是java高并发系列第16篇文章. 本篇内容 介绍CountDownLatch及使用场景 提供几个示例介绍CountDownLatch的使用 手写一个并行处理任务的工具类 假如有这样一个需求,当我们 ...
- java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier常见的6种使用场景及代码示例
这是java高并发系列第17篇. 本文主要内容: 介绍CyclicBarrier 6个示例介绍CyclicBarrier的使用 对比CyclicBarrier和CountDownLatch Cycli ...
- java高并发系列 - 第21天:java中的CAS操作,java并发的基石
这是java高并发系列第21篇文章. 本文主要内容 从网站计数器实现中一步步引出CAS操作 介绍java中的CAS及CAS可能存在的问题 悲观锁和乐观锁的一些介绍及数据库乐观锁的一个常见示例 使用ja ...
随机推荐
- 淘宝在hbase中的应用和优化
本文来自于NoSQLFan联合作者@koven2049,他在淘宝从事Hadoop及HBase相关的应用和优化. 对Hadoop.HBase都有深入的了解,本文就是其在工作中对HBase的应用优化小结, ...
- android图像处理系列之四-- 给图片添加边框(上)
图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...
- 漫漫人生路,学点Jakarta基础-Java8函数式编程
接口默认方法 Java8版本以后新增了接口的默认方法,不仅仅只能包含抽象方法,接口也可以包含若干个实例方法.在接口内定义实例方法(但是注意需要使用default关键字) 在此定义的方法并非抽象方法,而 ...
- [ Java ] [ Eclipse ] 加速 Eclipse 載入速度-轉載
加速 Eclipse 載入速度-轉載 https://read01.com/NJjNOB.html
- PHP表单生成器,快速生成现代化的form表单,快速上手
form-builder PHP表单生成器,快速生成现代化的form表单.包含复选框.单选框.输入框.下拉选择框等元素以及省市区三级联动.时间选择.日期选择.颜色选择.树型.文件/图片上传等功能. 详 ...
- django第三方库
1. django_celery_beat 作用:网页端配置定时任务 注意:1,需要迁移表格 2.需要注册app python3 manage.py makemigrations python3 ma ...
- iframe自适应高度解决方法 .
<div id="leftBar"> <iframe name="tag" src="_iframe.html" styl ...
- DataGridView控件绑定数据源
前言: 近期听说DataGridView控件能直接绑定数据源.而不用穿越这层那层的忍辱负重.获取数据.真是高兴的屁颠屁颠的.后来一想二狗肯定不会弄.特意写了一个笨蛋版的教程--也算记录生活.欢度端午了 ...
- lightSlider 好图片轮播插件 支持移动端
http://jquery-plugins.net/jquery-lightslider-lightweight-responsive-content-slider https://github.co ...
- 无阻塞加载外部js(动态脚本元素,XMLHttpRequest注入,LazyLoad)
动态脚本元素即在js中去创建<script>标签加载外部js并执行,这样加载的好处是文件的下载和执行过程不会阻塞页面的其他进程.通过下面两个例子对比出效果 <!DOCTYPE htm ...