java面试题整理( 三 )


如果当前线程持有了这个锁 , 那么再有这个锁的同步方法或代码块时这个线程可以再次进入 。
三十三.jvm队员是所做了哪些优化?
分为偏向锁(单线程访问的场景 , 加锁解锁速度快)、轻量级锁(多线程执行时的执行速度很快的场景 , 会进行自旋 , 效率更高)、重量级锁
三十四.锁消除和锁粗化?
锁消除:jvm在编译器会对代码进行是否可逃逸分析 , 发现同步的代码不可以不其他线程访问到就会进行锁消除 。
锁粗化:就是看同步块之间没有同步的代码执行的速度是否快 , 如果未同步的代码执行速度很快 。 那么可以将两个同步代码合为一个 , 这样同一个线程减少了申请锁的次数 , 提升了效率 。
三十五.乐观锁、cas?
乐观锁:乐观地认为并发的问题实属罕见 , 通过version来控制并发修改的问题 。 每次修改version都会加一 , 如果当前请求是获取version与最后提交时的version不同表明发生了并发问题 , 会更新失败 。
cas:compare and swap 比较值和预期值作对比 , 如果相同就进行更新 。 但是会出现ABA问题 。
三十六.ReentrantLock原理?
是通过cas和队列实现的 , 先通过cas获取锁的状态-》state为零且队列为空时当前线程得到锁、state不为零时将当前线程放入队列中进行排队-》持有锁线程释放锁 , 判断是否为公平锁 。 如果是公平锁 , 那么队列头的线程获得锁 。 如果是非公平锁 , 那么队列中的线程都有可能获得锁 。
三十七.AQS?
队列同步器
三十八.请尽可能详尽地对比下 Synchronized 和 ReentrantLock 的异同 。
1.ReentrantLock有公平锁和非公平锁
2.ReentrantLock可以终止等待
3.ReentrantLock可以分组唤醒
4.Synchronized使用起来更便捷 , ReentrantLock功能更多 , 带需要手动释放锁 。
三十九.ReentrantLock 是如何实现可重入性的?
获得锁的线程再次进入同步块的时候state会加一 , 释放锁的时候回减一 。
四十.ReadWriteLock 和 StampedLock
ReadWriteLock:读写锁 , 允许多线程并发读操作 。 StampedLock:相对于ReadWriteLock的一个优化 , ReadWriteLock并发读线程回阻塞写线程 。 而StampedLock则不会 。
四十一.如何让 Java 的线程彼此同步?
wait、notify、park、unpark
四十二.CyclicBarrier 和 CountDownLatch区别?
CyclicBarrier:控制并发进入的现成的数量 CountDownLatch:减数器 , 主线程可以阻塞等待 , 知道减数器为零 。
四十三.线程池实现原理?
java面试题整理文章插图
四十四.线程池核心的构造参数?
corePoolSize:核心线程数
maximumPoolSize:最大线程数
keepAlivesTimes:非核心线程存活时间
workQueue:等待队列
handler:拒绝策略
四十五.如何在 Java 线程池中提交线程?
execute:无法获取返回值、submit:可以通过futureTask获取返回值
四十六.既然提到可以通过配置不同参数创建出不同的线程池 , 那么 Java 中默认实现好的线程池又有哪些呢?请比较它们的异同
newFixedThreadPool:指定数量的线程池 , 核心线程数和最大线程数一样 。
newCachedThreadPool:缓存线程池 , 核心线程数为零 , 但最大线程数是Integer.MAX_VALUE,线程存活时间为60s 。
newSingleThreadExecutor:核心线程数和最大线程数都是一个线程 , 保证任务的顺序执行 。
四十七.Java 中各个线程是怎么彼此看到对方的变量的?
四十八.请谈谈 volatile 有什么特点 , 为什么它能保证变量对所有线程的可见性?
可以保证可见性 , 不能保证原子操作 , 如i++
四十九.请对比下 volatile 对比 Synchronized 的异同 。


推荐阅读