A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孤尽 中级黑马   /  2020-1-14 13:13  /  917 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孤尽 于 2020-1-14 13:14 编辑

java基础面试题


1.synchronized的底层原理?
synchronized底层原理,是跟JVM指令和monitor有关,你如果用到了synchronized关键字,在底层的JVM指令中,会有monitorenter和monitorexit两个指令,每个对象都有一个关联的monitor,如果要对一个对象加锁,那么必须获取这个对象关联的monitor的lock锁,monitor的锁是支持可重入的,里边会有一个一个计数器,第一次加锁时候,会把计数器加1,变成1,第二次时候,会在加一,变成2,这样就是可重入加锁,这个时候,如果其他线程来获取这个对象的锁,发现monitor的计数器不为0,意味着别人加锁了。然后这个线程就会进入block阻塞状态,什么都干不了,就是等着获取锁,如果程序执行出了synchronized的范围,会执行monitorexit指令,会对线程获取锁的那个对象的monitor计数器减1,如果有多次重入加锁就会对应多次减1,知道最后,计数器是0,然后后边阻塞的线程就可以获取锁了,同样只有一个线程可以获取到锁。

2.CAS锁的理解以及实现原理
CAS:compare and set
AtomicInteger.incrementAndGet();
线程在操作之前,会先去读取一下变量的旧值,然后把它加一,尝试赋值给变量,赋值之前会检查一下变量的值和之前获取到的值是否一致,如果一致,则可以赋值,如有值不一致,或者CAS失败,会重新读取然后设置,CAS的底层在硬件级别给你保证一定是原子性的,同一时间只有一个线程可以执行CAS,先比较后设置,其他线程同时去执行CAS将会失败

3.ConcurrtionHashMap实现原理
在JDk1.8之前,采取的是分段式加锁,将hashMap分为若干个数组,每个数组单独有一把锁,不同数组之间的操作不相互干扰,同一数组的操作需要串行化
JDK1.8之后,对之前的策略进行优化,对数组中的每个元素进行加锁,当数组中元素为null时,会使用CAS锁,保证同一时间只有一个线程能成功插入输入,假如CAS失败,代表这个元素已经被插入数组,此时会使用synchronized加锁,基于链表或者红黑树进行添加数据。

4.JDK中AQS的实现原理是什么?(Abstract Queue Synchronized)
java中的lock锁底层是使用AQS来实现的,AQS内部维护了一个volatile修饰的state变量,以及记录拿到锁的线程,还有一个等待队列
当多个线程同时获取AQS锁时,首先会使用CAS锁来更新state变量,CAS在硬件级别维护原子性,确保只有一个线程会设置成功,设置成功的线程,会将加锁线程的值改为当前线程,CAS失败的线程,会进入等待队列,等设置成功的线程执行完 unlock释放锁之后,会去唤醒等待队列中的第一个线程。
非公平锁:线程1执行结束唤醒线程2之时,此时线程3进来CAS设置state的值,会导致线程2CAS失败,
公平锁:线程1执行结束唤醒线程2之时,线程3进来先判断队列中有没有线程,如果有,则把自己放到队列中







0 个回复

您需要登录后才可以回帖 登录 | 加入黑马