多线程并发相关的几个重要基础知识点解析
问:volatile 变量和 atomic 变量有什么不同?
答:volatile 变量和 atomic 变量看起来很像,但功能却不一样。
volatile 变量可以确保先行关系,即写操作会发生在后续的读操作之前, 但它并不能保证原子性,也就是说其可以保证变量的可见性与有序性,无法保证原子性。例如用 volatile 修饰 count 变量,则 count++ 操作就不是原子性的。
AtomicInteger 类提供的 atomic 方法可以让这种操作具有原子性,其保证了并发安全的可见性、有序性、原子性三要素。如 getAndIncrement() 方法会原子性的进行增量操作把当前值加一,其它数据类型和引用变量也可以进行相似操作。
问:如果你提交任务时线程池队列已满了则会发会生什么?
答:这取决于线程池队列的实现。
如果线程池使用的是 LinkedBlockingQueue 无界队列,则继续添加任务到阻塞队列中等待执行理论上是不会满的,因为 LinkedBlockingQueue 可以近乎认为是一个无穷大的队列,可以无限存放任务。
如果线程池使用的是有界队列(比如 ArrayBlockingQueue)的话,任务首先会被添加到队列中,当队列满了则会使用拒绝策略 RejectedExecutionHandler 处理满了的任务,默认是 AbortPolicy,我们可以在创建线程池时修改这个策略,譬如是静默忽略还是崩溃等。
问:简单说说并发饥饿与死锁的区别?
答:饥饿是指系统不能保证某个进程的等待时间上界,从而使该进程长时间等待,当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿。当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被饿死。
死锁是指在多道程序系统中,一组进程中的每一个进程都无限期等待被该组进程中的另一个进程所占有且永远不会释放的资源。
他们的相同点是二者都由于竞争资源而引起。
他们的不同点可以从几个方面来总结:
从进程状态考虑,死锁进程都处于等待状态,忙等待(处于运行或就绪状态)的进程并非处于等待状态,但却可能被饿死;
死锁进程等待永远不会被释放的资源,饿死进程等待会被释放但却不会分配给自己的资源,表现为等待时限没有上界(排队等待或忙式等待);
死锁一定发生了循环等待,而饿死则不然。这也表明通过资源分配图可以检测死锁存在与否,但却不能检测是否有进程饿死;
死锁一定涉及多个进程,而饥饿或被饿死的进程可能只有一个;
在饥饿的情形下,系统中有至少一个进程能正常运行,只是饥饿进程得不到执行机会,而死锁则可能会最终使整个系统陷入死锁并崩溃;
欢迎工作一到五年的Java工程师朋友们加入Java架构开发:744677563
本群提供免费的学习指导 架构资料 以及免费的解答
不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java基础-Java的语法规范
1.Java中的语法大小写区分,举例:(int H;h=10)在声明变量时用大写,赋值却用的小写的他是不认的,还有关键字,大小写区分要不然不认的。 2.括号成对出现:举例写的时候将格式书写完整{}[](); 3.java中的语法符号都是半角符号:因为全角符号占2个字节 半角符号只占1个字节( ; ;)跟语法相关的都是半角符号。 4.Java跟C语言的语法很像:每句代码要有分号结束,因为Java模仿C语言; 5.命名规范;不能含有的字符很多 , 字母或下划线开头可以用数字结尾(变量名,类名,方法名,属性名)。 6.书写代码要有良好的代码书写格式手法(结构写完整,然后填充内容)会很少会发生语法上的错误。 7.备份:每天要学会备份,不备份存在隐患,尽量上传到服务器上去,上传到服务器上的好处,不存在丢除非服务区死掉。 代码越写路越窄:备份了的话可以回头看,回到以前看看,可以调整思路。 8.类的命名规范:里面如果有一个用public修饰的class那他的名称必须和文件名称一致。 一个文件文件可以申请多个class吗?:一个文件可以申请多个class文件 一个文件不能含有多个public clas...
- 下一篇
python之面向对象编程一
概述: 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处。随着时间的推移,开始使用了函数式编程,增强代码的重用性和可读性。今天学习新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计) 创建类和对象 面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。 类就是一个模板,模板里可以包含多个函数,函数里实现一些功能。 对象则是根据模板创建的实例,通过实例对象可以执行类中的函数。 1 class people: 2 def wave(self): 3 print('Hello World!') 4 5 obj = people() class为关键字,表示创建一个people的类 ,def...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装