-'s People
-'s Issues
能聊聊你对CAS的理解以及其底层实现原理可以吗?
CAS,compare and set
CAS在底层的硬件级别给你保证一定是原子的,同一时间只有一个线程可以执行CAS,先比较再设置,其他的线程的CAS同时间去执行此时会失败
说说HashMap是如何进行扩容的可以吗?
判断二进制结果中是否多出一个bit的1,如果没多,那么就是原来的index,如果多了出来,那么就是index + oldCap,通过这个方式,就避免了rehash的时候,用每个hash对新数组.length取模,取模性能不高,位运算的性能比较高
ConcurrentHashMap实现线程安全的底层原理到底是什么?
JDK 1.8以前,多个数组,分段加锁,一个数组一个锁
JDK 1.8以后,优化细粒度,一个数组,每个元素进行CAS,如果失败说明有人了,此时synchronized对数组元素加锁,链表+红黑树处理,对数组每个元素加锁
你对JDK中的AQS理解吗?AQS的实现原理是什么?
AQS,Abstract Queue Synchronizer,抽象队列同步器
说说线程池的底层工作原理可以吗?
系统是不可能说让他无限制的创建很多很多的线程的,会构建一个线程池,有一定数量的线程,让他们执行各种各样的任务,线程执行完任务之后,不要销毁掉自己,继续去等待执行下一个任务
提交任务,先看一下线程池里的线程数量是否小于corePoolSize,也就是3,如果小于,直接创建一个线程出来执行你的任务
如果执行完你的任务之后,这个线程是不会死掉的,他会尝试从一个无界的LinkedBlockingQueue里获取新的任务,如果没有新的任务,此时就会阻塞住,等待新的任务到来
你持续提交任务,上述流程反复执行,只要线程池的线程数量小于corePoolSize,都会直接创建新线程来执行这个任务,执行完了就尝试从无界队列里获取任务,直到线程池里有corePoolSize个线程
总结
总结: 原子性:操作一个变量宏观上分为:读取/计算/写入。volatile只能保证读取和写入的原子性,但是整个操作的原子性无法保证。 可见性:主要是lock指令+MESI协议,让修改后的值强制刷入主存,并且让其他CPU的换成全部失效。 有序性:主要是因为有内存屏障。
谈谈你对Java内存模型的理解可以吗?
read、load、use、assign、store、write
你知道HashMap底层的数据结构是什么吗?
JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。
HashMap 获取 key 的 hashCode 得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置。如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同会在这个位置挂一个链表。
JDK 1.8 HashMap 底层是 数组和链表+加红黑树。链表在达到一定长度时会变成红黑树(默认是8)。
hash算法的优化:对每个hash值,在他的低16位中,让高低16位进行了异或,让他的低16位同时保持了高低16位的特征,尽量避免一些hash值后续出现冲突,大家可能会进入数组的同一个位置
寻址算法的优化:用与运算替代取模,提升性能
` // JDK 1.8以后的HashMap里面的一段源码
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}`
说说synchronized关键字的底层原理是什么?
synchronized 同步语句块的实现使用的是 monitorenter 和 monitorexit 指令,其中 monitorenter 指令指向同步代码块的开始位置,monitorexit 指令则指明同步代码块的结束位置。
计数器加1,然后第二次synchronized那里,会再次获取myObject对象的monitor的锁,这个就是重入加锁了,然后计数器会再次加1,变成2。这个时候,其他的线程在第一次synchronized那里,会发现说myObject对象的monitor锁的计数器是大于0的,意味着被别人加锁了,然后此时线程就会进入block阻塞状态,什么都干不了,就是等着获取锁
`// 线程1
synchronized(myObject) { -> 类的class对象来走的
// 一大堆的代码
synchronized(myObject) {
// 一大堆的代码
}
}
`
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.