JDK、JRE、JVM 三者有什么关系?
答案:
JDK(全称 Java Development Kit),Java开发工具包,能独立创建、编译、运行程序。
JDK = JRE + java开发工具(javac.exe/java.exe/jar.exe)
JRE(全称 Java Runtime Environment),能运行已编译好的程序,但不能创建程序
JRE = JVM + java核心类库
JVM (全称 Java Virtual Machine),java虚拟机。
java创建对象有哪些方式?
答案:
== 和 equals 有什么区别?
答案:
hashCode()的作用?
答案:生成哈希码,int类型,用于确定该对象在哈希表中的索引位置。每个类中都包含这个方法。
String、StringBuffer、StringBuilder 有什么区别?
答案
final
修饰,对象不可变,线程安全。如果对一个已经存在的String对象修改,会重新创建一个新对象,并把值放进去。synchronized
关键字修饰,线程安全try-catch-finally,如catch中return了,还会执行finally吗?
答案:当然啦,会在return之前执行。
进程和线程的区别?
答案:
synchronized 的内部原理?
答案:java提供的原子性内置锁,也被称为监视器锁。使用synchronized
之后,会在编译之后在同步的代码块前后加上monitorenter
和monitorexit
字节码指令,依赖操作系统底层互斥锁实现。实现原子性操作和解决共享变量的内存可?性问题。
内部处理过程(内部有两个队列waitSet和entryList。):
entryList
waitSet
等待被唤醒,调用notify或者notifyAll之后又会进入entryList竞争锁synchronized 和 ReentrantLock 的区别?
答案:
AQS (AbstractQueuedSynchronizer 抽象队列同步器 )的原理?
答案:AQS内部维护一个state状态位
,尝试加锁的时候通过CAS(CompareAndSwap)
修改值,如果成功设置为 1,并且把当前线程ID赋值,则代表加锁成功。
一旦获取到锁,其他的线程将会被阻塞进入阻塞队列自旋,获得锁的线程释放锁的时候将会唤醒阻塞队列中的线程,释放锁的时候则会把state
重新置为0,同时当前线程ID
置为空。
CAS 有什么缺点?
答案:在多线程场景下,更新变量值被其他线程跑了个对冲,CAS会出现ABA问题。解决方式有很多,
AtomicStampedReference
,增加了标志字段,更新时不光检查值,还要检查当前的标志是否等于预期标志,全部满足条件才会更新Java 都用过哪些锁?
答案:
HashMap原理?
答案:内部由数组和链表组成,非线程安全。JDK1.7和1.8的主要区别在于头插和尾插方式的修改,头插容易导致HashMap链表死循环,并且1.8之后加入红黑树
对性能有提升。
红黑树
。最后判断元素个数是否超过默认的?度(16)*负载因子(0.75),也就是12,超过则进行扩容。红黑树的时间复杂度 O(logn);链表的时间复杂度 O(n),当链表过长时,红黑树能大大提高查询性能。
ConcurrentHashMap 如何能保证线程安全的?
答案:ConcurrentHashmap在JDK1.7和1.8的版本改动比较大。
Segment
继承于ReentrantLock
,HashEntry
存储键值对数据。ArrayList 和 LinkedList 有什么区别?
答案:
1、Arraylist
2、LinkedList
volatile 原理?
答案:volatile声明的变量,值被更新后对其他线程立即可?。
CPU会根据缓存一致性协议,强制线程重新从主内存加载最新的值到自己的工作内存中,而不是直接用cpu缓存中的值。
ThreadLocal 原理?
答案:ThreadLocal有一个静态内部类ThreadLocalMap
,ThreadLocalMap
又包含了一个Entry数组,Entry本身是一个弱引用,他的key是指向ThreadLocal的弱引用,Entry具备保存key – value键值对的能力。
在使用完之后调用remove方法
删除Entry对象,避免出现内存泄露。
什么是工作内存、主内存?
答案:
JUC并发包用过哪些线程安全的类?
答案:
ThreadPoolExecutor 有哪些构造参数?
答案:核心线程数、最大线程数、最大空闲时间、时间单位、任务队列、线程工厂、拒绝策略
ThreadPoolExecutor 的拒绝策略有哪些?
答案:
RejectedExecutionHandler
接口,自定义实现线程有哪些状态?是如何转换?
答案:New、Runnable、Running、Blocked、Waiting、Timed Waiting、Terminated
IO 模型有哪五种?
答案:
1、阻塞IO。当 应用B 发起读取数据申请时,如果内核数据没有准备好,应用B会一直处于等待数据状态,直到内核把数据准备好了交给应用B才结束。
2、非阻塞IO。当应用B发起读取数据申请时,如果内核数据没有准备好会即刻告诉应用B,不会让B在这里等待。
3、IO复用模型。进程通过将一个或多个fd传递给select,阻塞在select操作上,select帮我们侦测多个fd是否准备就绪,当有fd准备就绪时,select返回数据可读状态,应用程序再调用recvfrom读取数据。
4、信号IO。信号驱动IO不是用循环请求询问的方式去监控数据就绪状态,而是在调用sigaction时候建立一个SIGIO的信号联系,当内核数据准备好之后再通过SIGIO信号通知线程数据准备好后的可读状态,当线程收到可读状态的信号后,此时再向内核发起recvfrom读取数据的请求,因为信号驱动IO的模型下应用线程在发出信号监控后即可返回,不会阻塞,所以这样的方式下,一个应用线程也可以同时监控多个fd。
5、异步IO。解决了应用程序需要先后查看数据是否就绪
、发送接收数据请求
两个阶段的模式,在异步IO的模式下,只需要向内核发送一次请求就可以完成状态查询和数据拷贝的所有操作。
阻塞IO 和 非阻塞IO 的区别?
答案:如果数据没有就绪,在查看数据是否就绪
的这个阶段是一直等待?还是直接返回一个标志信息。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_43842093/article/details/122008759
内容来源于网络,如有侵权,请联系作者删除!