java大公司后端多线程面试题最强分享
点击上方“好好学java”,选择“置顶公众号”
优秀学习资源、干货第一时间送达!
精彩内容
java实战练习项目教程
2018微服务资源springboot、springcloud、docker、dubbo实战等倾心分享
2018年java架构师全套学习教程
最新大数据培训完整视频教程
2018年java最新全套培训学习教程
29、java中用到的线程调度算法是什么
抢占式。一个线程用完CPU之后,操作系统会根据线程优先级、线程饥饿情况等数据算出一个总的优先级并分配下一个时间片给某个线程执行。
30、Thread.sleep(0)的作用是什么
由于Java采用抢占式的线程调度算法,因此可能会出现某条线程常常获取到CPU控制权的情况,为了让某些优先级比较低的线程也能获取到CPU控制权,可以使用Thread.sleep(0)手动触发一次操作系统分配时间片的操作,这也是平衡CPU控制权的一种操作。
31、什么是CAS
CAS,全称为Compare and Swap,即比较-替换。假设有三个操作数:内存值V、旧的预期值A、要修改的值B,当且仅当预期值A和内存值V相同时,才会将内存值修改为B并返回true,否则什么都不做并返回false。当然CAS一定要volatile变量配合,这样才能保证每次拿到的变量是主内存中最新的那个值,否则旧的预期值A对某条线程来说,永远是一个不会变的值A,只要某次CAS操作失败,永远都不可能成功
32、什么是乐观锁和悲观锁
乐观锁:乐观锁认为竞争不总是会发生,因此它不需要持有锁,将比较-替换这两个动作作为一个原子操作尝试去修改内存中的变量,如果失败则表示发生冲突,那么就应该有相应的重试逻辑。
悲观锁:悲观锁认为竞争总是会发生,因此每次对某资源进行操作时,都会持有一个独占的锁,就像synchronized,不管三七二十一,直接上了锁就操作资源了。
33、ConcurrentHashMap的并发度是什么?
ConcurrentHashMap的并发度就是segment的大小,默认为16,这意味着最多同时可以有16条线程操作ConcurrentHashMap,这也是ConcurrentHashMap对Hashtable的最大优势,任何情况下,Hashtable能同时有两条线程获取Hashtable中的数据吗?
34、ConcurrentHashMap的工作原理
ConcurrentHashMap在jdk 1.6和jdk 1.8实现原理是不同的.
jdk 1.6:
ConcurrentHashMap是线程安全的,但是与Hashtablea相比,实现线程安全的方式不同。Hashtable是通过对hash表结构进行锁定,是阻塞式的,当一个线程占有这个锁时,其他线程必须阻塞等待其释放锁。ConcurrentHashMap是采用分离锁的方式,它并没有对整个hash表进行锁定,而是局部锁定,也就是说当一个线程占有这个局部锁时,不影响其他线程对hash表其他地方的访问。
具体实现:ConcurrentHashMap内部有一个Segment
jdk 1.8
在jdk 8中,ConcurrentHashMap不再使用Segment分离锁,而是采用一种乐观锁CAS算法来实现同步问题,但其底层还是“数组+链表->红黑树”的实现。
37、CyclicBarrier和CountDownLatch区别
这两个类非常类似,都在java.util.concurrent下,都可以用来表示代码运行到某个点上,二者的区别在于:
CyclicBarrier的某个线程运行到某个点上之后,该线程即停止运行,直到所有的线程都到达了这个点,所有线程才重新运行;CountDownLatch则不是,某线程运行到某个点上之后,只是给某个数值-1而已,该线程继续运行
CyclicBarrier只能唤起一个任务,CountDownLatch可以唤起多个任务
CyclicBarrier可重用,CountDownLatch不可重用,计数值为0该CountDownLatch就不可再用了
39、java中的++操作符线程安全么?
不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差
40、你有哪些多线程开发良好的实践?
给线程命名
最小化同步范围
优先使用volatile
尽可能使用更高层次的并发工具而非wait和notify()来实现线程通信,如BlockingQueue,Semeaphore
优先使用并发容器而非同步容器.
考虑使用线程池
关于volatile关键字
1、可以创建Volatile数组吗?
Java 中可以创建 volatile类型数组,不过只是一个指向数组的引用,而不是整个数组。如果改变引用指向的数组,将会受到volatile 的保护,但是如果多个线程同时改变数组的元素,volatile标示符就不能起到之前的保护作用了
2、volatile能使得一个非原子操作变成原子操作吗?
一个典型的例子是在类中有一个 long 类型的成员变量。如果你知道该成员变量会被多个线程访问,如计数器、价格等,你最好是将其设置为 volatile。为什么?因为 Java 中读取 long 类型变量不是原子的,需要分成两步,如果一个线程正在修改该 long 变量的值,另一个线程可能只能看到该值的一半(前 32 位)。但是对一个 volatile 型的 long 或 double 变量的读写是原子。
一种实践是用 volatile 修饰 long 和 double 变量,使其能按原子类型来读写。double 和 long 都是64位宽,因此对这两种类型的读是分为两部分的,第一次读取第一个 32 位,然后再读剩下的 32 位,这个过程不是原子的,但 Java 中 volatile 型的 long 或 double 变量的读写是原子的。volatile 修复符的另一个作用是提供内存屏障(memory barrier),例如在分布式框架中的应用。简单的说,就是当你写一个 volatile 变量之前,Java 内存模型会插入一个写屏障(write barrier),读一个 volatile 变量之前,会插入一个读屏障(read barrier)。意思就是说,在你写一个 volatile 域时,能保证任何线程都能看到你写的值,同时,在写之前,也能保证任何数值的更新对所有线程是可见的,因为内存屏障会将其他所有写的值更新到缓存。
3、volatile类型变量提供什么保证?
volatile 主要有两方面的作用:1.避免指令重排2.可见性保证.例如,JVM 或者 JIT为了获得更好的性能会对语句重排序,但是 volatile 类型变量即使在没有同步块的情况下赋值也不会与其他语句重排序。 volatile 提供 happens-before 的保证,确保一个线程的修改能对其他线程是可见的。某些情况下,volatile 还能提供原子性,如读 64 位数据类型,像 long 和 double 都不是原子的(低32位和高32位),但 volatile 类型的 double 和 long 就是原子的.
推荐阅读
1. 每日都见到的springboot日志
2. springmvc入门
3. servlet就是这么简单
4. 重温javaweb过滤器filter
附上热门QQ群,存放资源和历史资料,2000容量(低门槛付费群),长按二维码入群
java大公司后端多线程面试题最强分享相关推荐
- 大公司的PHP面试题
大公司的PHP面试题 回复 1 楼 2013-02-09 大公司的PHP面试题 1. 禁用COOKIE 后 SEESION 还能用吗? 2. 抓取远程图片到本地,你会用什么函数? 4. 你觉得在pV1 ...
- JAVA前端与后端交互面试题
1.前端与后端交互面试题 1.1. 描述Servlet调用过程? 答案: (1)在浏览器输入地址,浏览器先去查找hosts文件,将主机名翻译为ip地址,如果找不到就再去查询dns服务器将主机名翻译成i ...
- 阿里8年资深架构师最强分享:JAVA面试八股文。堪称史上最强分享。
一.Java 基础知识 1.Object 类相关方法 getClass 获取当前运行时对象的 Class 对象. hashCode 返回对象的 hash 码. clone 拷贝当前对象, 必须实现 C ...
- 各大公司需要的面试题集
文章目录 壹:java集合 1.1 常用集合的导图 1.2 Collection和Map 二:java并发 2.1 java多线程中名词的概念 2.2 java实现并发的方式 2.2.1 synchr ...
- java epoll select_Java后端常见面试题
写在前面: 本来每个问题上面都有超链接,都有相对应的答案.但是不知道为什么就是不能发布.想看每个问题的详细解答和知识点,点击文末左下角的"阅读原文"即可查看! 作者的话 Java基 ...
- java 大数据(多线程)和尚分馒头 整理
Box 箱子类.Monk和尚类.App测试类 Box 箱子类 package com.xc.thread.monk;/*** 馒头箱子* @author Administrator**/ public ...
- 面试Java岗位时,总被面试题困扰,分享企业爱用的面试题
import java和javax有什么区别? 刚开始的时候 JavaAPI 所必需的包是 java 开头的包,javax 当时只是扩展 API 包来使用.然而随着时间的推移,javax 逐渐地扩展成 ...
- 各大公司硬件面试题目
各大公司的硬件笔试题 f) 画出微机接口电路中,典型的输入设备与微机接口逻辑示意图(数据接口.控制接口.所存器/缓冲器) 3. 设想你将设计完成一个电子电路方案.请简述用EDA软件(如PROTEL)进 ...
- 零基础学Java大数据难不难
java大数据如今在企业中用到的次数是非常多的,很多人都比较看好java技术,那么零基础学Java大数据难不难?想要学习java技术说难不难,说简单也不是很简单,来看看下面的详细介绍就知道了. 零基础 ...
最新文章
- 用hmmlearn学习隐马尔科夫模型HMM
- 【数据竞赛】“达观杯”文本智能处理挑战赛1
- tcp/udp高并发和高吐吞性能测试工具
- javascript数组浅谈1
- 用yum安装完mysql后没有mysqld的问题
- 知识点 组合数学 卡特兰数
- 基本功 | Litho的使用及原理剖析
- 搭建hadoop分布式集群
- [转载] Python字典的setdefault()方法
- paip.c3p0 nullpointexcept 配置文件根路径读取bug 解决
- kis商贸系列加密服务器,金蝶KIS商贸系列V3.0发版说明教程.doc
- Pillow 库简介
- #LeetCode15. 三数之和 @FDDLC
- “苹果”在中国的血汗工厂
- PseudoSeg: Designing Pseudo Labels for Semantic Segmentation阅读笔记
- 中国著名画家司志明画伟人获全国画界称赞,单幅被拍出65万
- iOS APP调取短信 发送消息给其他人
- mysql isnum()_mysql 一些基础的语法和命令
- html卡死手机,手机页面加载地图,双手操作放大,APP卡死
- 网易放大招?生存MMO手游明日之后开测,沙盒+大逃杀游戏你喜欢吗?
热门文章
- oracle adg的特点是什么,Oracle12c ADG新特性
- 近世代数--整环上的整除理论--主理想整环中最大公因子的存在表示定理
- 近世代数--子环--怎么判断是不是子环?
- [ARM-assembly]-ARMv8 A64 Quick Reference
- python将索引升序_程序在Python中按升序删除元素后获取列表的索引
- /GS 编译选项,_security_cookie,软件强制DEP
- win10如何换pip源
- 【Web安全】php://filter 的浅略底层分析
- 路由器固件下的小试牛刀,与漏洞相关的经验分享
- 24、HTML 属性