java中的高并发-程序员宅基地

这个大概可以作为一个继续深究下去的引子。

首先得先理解并发与并行的含义,并行其实指的是串行并行,程序A和程序B交替执行,而从计算机cpu的执行时间来说,从人的感受上来说,就像是并行。

而并行一般就是在多核cpu的环境下,多个任务在同一时间在执行。

另外一个要清楚的概念就是,进程与线程的概念,进程是计算机资源分配和调度的最小单位,而线程是程序执行和调度的最小单位,进程就像是一间房子,这个房子里面住了不同的人,他们共享一些资源,这就导致了资源的抢占与释放。

关于并行的一些概念,死锁、活锁、临界区、饥饿,阻塞与非阻塞等等概念,还有关于并行的两个规律,说明了cpu个数和可并行代码与系统加速比之间的关系。

关于JMM的几个原则:原子性,可见性,有序性(指令重排)

线程的新建、终止、中断:

新建:有两种方法,一种是继承thread类,还有一种是实现runnable接口,第一种方法需要重写run方法,不可直接调用run方法,第二种方法是通过向thread传入一个runnable的实例,然后再通过start方法来进行调用

终止:不要直接使用thread.stop()来强制终止线程,这样可能会导致程序状态混乱,最好的方法就是在run中来控制线程的退出。

中断:interrupt,可以捕获中断状态,从而可以做进一步的处理(退出or休眠一段时间)。

线程挂起suspend与线程继续执行resume

等待线程结束join和谦让yield

对于关键字volatile关键字来说,读是对所有线程都是可见的,但是对于写的可见性却不一定了,当多个线程进行修改时,还是会影响程序的正确性。

java中关于锁的机制:

在项目中,arraylist和hashmap都不是线程安全的,庆幸的是,这些在concurrent包中,都有具体线程安全的实现。

重入锁:java.util.concurrent.locks.ReentrantLock,它是一种可以反复进入的锁,获得一次锁,就要注意记得显式的释放一次锁。与synchronized不同的是,他可以进行中断响应,也就是在等待锁的过程中可以去做一些其他的事情,比如两个线程之间形成了死锁,这个就可以通过中断通知的方式来响应中断,解除死锁。除此之外,它还可以指定时间来限制多长时间的申请锁,若到达时间限制,则放弃锁申请,trylock,可带参数也可以不带。还可以指定锁是否为公平锁。

 

 

与重入锁一起使用的,还有condition对象,对应的有await和signal方法,这与synchronized和object.await和notify搭配使用是很类似的,在java内部ArrayBlockingQueue实现,就使用了重入锁。

concurrenthashmap采用的分段锁的形式来保持线程安全的,如果要获取map的size(),则需要获得所有段的锁

另一个很重要的机制就是Semaphore,信号量机制允许多个线程同时访问。

另一个非常重要的锁就是读写锁,readwritelock,对于读写锁的读写访问约束情况如下:

倒计数器:CountDownLatch

循环栅栏:CyclicBarrier

线程阻塞工具类:LockSupport,可以在任何位置阻塞线程,不用提前获得锁,同时也不会造成线程无法继续执行的情况。

另外一个非常重要的概念就是线程池的概念,目前并发包里提供了如下线程池:为了避免人为的频繁的创建和销毁线程,导致性能下降,使用线程池来统一处理,能带来不少好处。

execuator相当于一个线程池的工厂,从它能获得各种不同类型的线程池,execuator的框架图:

 

通过扩展threadpoolexecuator可以捕获一些不易被发现的异常信息。

注意线程提交的execute和submit的区别。

fork/join框架,支持任务分解的高并发框架:

可以通过

Collections.synchronizedMap(new HashMap<>());

使用委托的方式来生成一个线程案卷的map,但是这种方式的效率并不是太高,需要先获得mutex锁。

同理对于list也有类似的方法。vector是线程安全的。concurrentlinkedqueue是高并发环境下性能最好的队列了

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/huangqing510/article/details/100031777

智能推荐

GIS二次开发(C++):矢量缓冲区分析 GDAL/QGIS开发包_c++ gis开发包-程序员宅基地

文章浏览阅读636次,点赞12次,收藏10次。上述代码只能获取当前地图中的第一个图层作为缓冲区分析的数据源,不支持选择图层。_c++ gis开发包

ECharts折线图渲染速度变慢、ECharts折线图数据为0时不显示线条_echarts 折现图 值为0-程序员宅基地

文章浏览阅读6.4k次,点赞9次,收藏26次。写在前面:在公司做一个大屏可视化项目时,遇到了这样的需求:1.使折线图渲染速度变慢;2.当折线图数据为0时不显示线条本文就拿ECharts给的示例做演示。示例代码如下:import * as echarts from 'echarts';var chartDom = document.getElementById('main');var myChart = echarts.init(chartDom, 'dark');var option;option = { xAxi._echarts 折现图 值为0

React监听窗口变化_react 监听控制台打开关闭变化-程序员宅基地

文章浏览阅读8.8k次。React组件监听窗口变化基本思路:改变事件方法中的this指向constructor(props) { this.resizeBind = this.resizeTTY.bind(this)}添加监听componentDidMount() { window.addEventListener('resize', this.resizeBind)}注销事件compone..._react 监听控制台打开关闭变化

硬件测试入门-聊一聊示波器的带宽_示器的带宽-程序员宅基地

文章浏览阅读1.8k次,点赞8次,收藏31次。带宽通常为示波器的第一指标,也是我们在选择示波器时首要考虑的因素。信号经过探头进入示波器后,首先经过的就是放大器和衰减器,它们决定了示波器的带宽大小,在没有特别说明的情况下我们说的带宽是示波器模拟前端放大器的带宽,也就是-3dB截止点。_示器的带宽

Total Variation loss-程序员宅基地

文章浏览阅读653次。图像上的一点点噪声可能就会对复原的结果产生非常大的影响,很多复原算法都会放大噪声。因此需要在最优化问题的模型中添加一些正则项来保持图像的光滑性,图片中相邻像素值的差异可以通过降低TV loss来一定程度上解决,比如降噪,对抗checkerboard等等。受噪声污染的图像的总变分比无噪图像的总变分明显的大,最小化TV理论上就可以最小化噪声。总变分定义为梯度幅值的积分。即:求每一个像素和横向下一个像素的差的平方,加上纵向下一个像素的差的平方。_total variation loss

1.自动化上线代码-分布式版本控制系统Git_系统功能分布式上线-程序员宅基地

文章浏览阅读414次。01.自动化上线代码基本介绍01.自动化上线代码基本介绍1.CI/CD基础概念1.1 软件开发生命周期1.2 什么是环境1.3 什么是代码部署1.4 代码发布的方式1.4.1 手动发布1.4.2 自动发布2.什么是持续集成2.1 什么是集成2.2 什么是持续集成2.3 持续集成的好处2.4 持续集成的目的3.什么是持续交付4.什么是持续部署5.完整代码发布流程02.分布式版本控制系统Git._系统功能分布式上线

随便推点

QT:等待对话框_qt等待对话框-程序员宅基地

文章浏览阅读967次。1. gif动图显示等待对话框#include "waitting.h"#include "ui_waitting.h"Waitting::Waitting(QWidget *parent) : QWidget(parent), ui(new Ui::Waitting){ ui->setupUi(this); this->setWindowOpacity(0.8); setWindowFlags(Qt::Dialog | Qt::Frame_qt等待对话框

新手探索NLP(十五)——终章_nlp constraint-程序员宅基地

文章浏览阅读335次。目录中文语音的机器处理汉语语言学的研究未登录词识别概率图模型信息熵互信息联合熵条件熵统计语言模型隐马尔科夫模型Viterbi算法最大熵模型最大熵原理GIS实现条件随机场模型概念:线性链条件随机场不同模型的比较与总结词性、语块和命名实体识别词性语块命名实体识别句法理论和自动分析理论基础句法分析..._nlp constraint

电脑怎么用计算机打开指令,win10如何打开计算器工具 快速打开Win10计算器的四种方法...-程序员宅基地

文章浏览阅读602次。最近,有位windows10用户反映自己在写“电脑配置”相关文章的时候,常常需要使用到计算器工具。可是每次在Win10系统中找计算器工具都要找很久。这该怎么办呢?接下来,小编就向大家分享四种快速打开Win10计算器的方法。方法一:使用组合快捷键1、同时按下Win+R组合快捷键打开运行操作框,然后在打开后面输入命令:Calc.exe,如下图。2、然后点击底部的确定,就可以快速打开Win10计算器了。..._win10计算器快捷键

Excel 单元格自定义格式,输入ddd.mmss格式的度分秒,转化显示成ddd mm ss格式_dd.mmss是什么格式-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏2次。Excel 单元格自定义格式,输入ddd.mmss格式的度分秒,显示成ddd mm ss格式测绘中常用到的角度记录格式即为ddd.mmss,常用于电子经纬仪数据导出以及测量计算软件的数据导入,如何利用excel表格实现这一格式的数据显示呢?如下图设置单元格格式即可。”0”:数字占位符。如果单元格的内容大于占位符,则显示实际数字,如果小于点位符的数量,则用0补足。“#”:数字占位符。只显有意义的零而不显示无意义的零。小数点后数字如大于”#”的数量,则按”#”的位数四舍五入。“?”:数字占位符。在小_dd.mmss是什么格式

企业微信跳转链接,跳转到默认浏览器打开_企业微信#target=out-程序员宅基地

文章浏览阅读2.6w次,点赞2次,收藏7次。在链接上最后,加上:“#target=out” 参数即可跳转至电脑默认的浏览器。_企业微信#target=out

DiskGenius的 “终止位置参数溢出”错误解决方法。_终止位置参数溢出 重新建立-程序员宅基地

文章浏览阅读2.6k次。DiskGenius的 “终止位置参数溢出”错误解决方法。_终止位置参数溢出 重新建立

推荐文章

热门文章

相关标签