随笔分类 -  常见面试题

摘要:SynchronousQueue VS LinkedTransferQueue SynchronousQueue 是一个队列长度为 0 的 BlockingQueue,所以没有一个地方来暂存元素,导致每次取数据都要先阻塞,直到有数据被放入;同理,每次放数据的时候也会阻塞,直到有消费者来取。它所做的就 阅读全文
posted @ 2021-01-15 13:25 天宇轩-王 阅读(297) 评论(0) 推荐(0)
摘要:AQS 的作用 AQS 是一个用于构建锁、同步器等线程协作工具类的框架,有了 AQS 以后,很多用于线程协作的工具类就都可以很方便的被写出来,可以让更上层的开发极大的减少工作量,避免重复造轮子,同时也避免了上层因处理不当而导致的线程安全问题,因为 AQS 把这些事情都做好了。总之,有了 AQS 之后 阅读全文
posted @ 2021-01-14 15:32 天宇轩-王 阅读(319) 评论(0) 推荐(0)
摘要:主从数据库不一致如何解决? 场景描述,对于主从库,读写分离,如果主从库更新同步有时差,就会导致主从库数据的不一致。 1、忽略这个数据不一致,在数据一致性要求不高的业务下,未必需要时时一致性。 2、强制读主库,使用一个高可用的主库,数据库读写都在主库,添加一个缓存,提升数据读取的性能。 3、选择性读主 阅读全文
posted @ 2021-01-13 17:47 天宇轩-王 阅读(2002) 评论(0) 推荐(0)
摘要:这道题最好把对象和变量分开说明,否则容易产生误解。以下都是64位环境下。 针对对象: 压缩状态:MarkWord 8+klass 4+数据0+对齐4=16 非压缩状态:MarkWord 8+klass 8+数据0+对齐0=16 针对变量: 压缩状态:4 非压缩状态:8 阅读全文
posted @ 2021-01-13 17:24 天宇轩-王 阅读(149) 评论(0) 推荐(0)
摘要:AtomicInteger和LongAdder区别 AtomicLong 存在的问题 首先我们来看一段代码: /** * @author WGR * @create 2021/1/13 -- 16:17 */ public class AtomicLongDemo { public static v 阅读全文
posted @ 2021-01-13 16:36 天宇轩-王 阅读(869) 评论(0) 推荐(0)
摘要:Adder 和 Accumulator 有什么区别 Adder 的介绍 我们要知道 Adder 和 Accumulator 都是 Java 8 引入的,是相对比较新的类。对于 Adder 而言,比如最典型的 LongAdder,在高并发下 LongAdder 比 AtomicLong 效率更高,因为 阅读全文
posted @ 2021-01-13 15:59 天宇轩-王 阅读(175) 评论(0) 推荐(0)
摘要:为什么 Map 桶中超过 8 个才转为红黑树? JDK 1.8 的 HashMap 和 ConcurrentHashMap 都有这样一个特点:最开始的 Map 是空的,因为里面没有任何元素,往里放元素时会计算 hash 值,计算之后,第 1 个 value 会首先占用一个桶(也称为槽点)位置,后续如 阅读全文
posted @ 2021-01-13 15:31 天宇轩-王 阅读(560) 评论(2) 推荐(1)
摘要:安全点与安全区域 安全点: 程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才 能停顿下来开始GC,这些位置称为“安全点(Safepoint) ”。 Safe Point的选择很重要,==如果太少可能导致GC等待的时间太长,如果 太频繁可能导致运行时的性能问题。==大部分指令的执行时间 阅读全文
posted @ 2021-01-13 13:26 天宇轩-王 阅读(276) 评论(0) 推荐(0)
摘要:/** * @author WGR * @create 2021/1/12 -- 17:12 */ public class LRUCacheDemo2<K,V> extends LinkedHashMap<K,V> { private int capacity; public LRUCacheDe 阅读全文
posted @ 2021-01-12 17:18 天宇轩-王 阅读(126) 评论(0) 推荐(0)
摘要:Spring是怎么解决循环依赖的? 首先,Spring 解决循环依赖有两个前提条件: 不全是构造器方式的循环依赖 必须是单例 基于上面的问题,我们知道Bean的生命周期,本质上解决循环依赖的问题就是三级缓存,通过三级缓存提前拿到未初始化的对象。 第一级缓存:用来保存实例化、初始化都完成的对象 第二级 阅读全文
posted @ 2021-01-12 00:18 天宇轩-王 阅读(921) 评论(0) 推荐(0)
摘要:使用keys指令可以扫出指定模式的key列表。 对方接着追问:如果这个redis正在给线上的业务提供服务,那使用keys 指令会有什么问题? 这个时候你要回答redis关键的一个特性:redis的单线程的。keys指令会 导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能 恢复。这个时 阅读全文
posted @ 2021-01-11 21:44 天宇轩-王 阅读(166) 评论(0) 推荐(0)
摘要:GC的性能指标 吞吐量:运行用户代码的时间占总运行时间的比例。 暂停时间:执行垃圾收集时,程序工作线程被暂停的时间。 内存占用:Java堆区所占的内存大小。 高吞吐量较好因为这会让应用程序的用户感觉应用程序线程在做生产性工作。直觉上,吞吐量越高程序运行越快。有时候甚至短暂的200毫秒暂停都可能打断终 阅读全文
posted @ 2021-01-11 21:17 天宇轩-王 阅读(328) 评论(0) 推荐(0)
摘要:拒绝时机 首先,新建线程池时可以指定它的任务拒绝策略,例如: newThreadPoolExecutor(5, 10, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadPoolExecutor.DiscardOldestPoli 阅读全文
posted @ 2021-01-08 15:28 天宇轩-王 阅读(543) 评论(0) 推荐(0)
摘要:类加载器子系统的作用 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识,ClassLoader只负责加载class文件,加载的类信息存放在方法区中,除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量。 类加载过程 加载 阅读全文
posted @ 2021-01-07 17:41 天宇轩-王 阅读(98) 评论(0) 推荐(0)
摘要:CAS 简介 首先我们来看一下 CAS 是什么,它的英文全称是 Compare-And-Swap,中文叫做“比较并交换”,它是一种思想、一种算法。 在多线程的情况下,各个代码的执行顺序是不能确定的,所以为了保证并发安全,我们可以使用互斥锁。而 CAS 的特点是避免使用互斥锁,当多个线程同时使用 CA 阅读全文
posted @ 2021-01-07 11:20 天宇轩-王 阅读(351) 评论(0) 推荐(1)
摘要:线程池7大参数 public ThreadPoolExecutor(int corePoolSize, // 1 int maximumPoolSize, // 2 long keepAliveTime, // 3 TimeUnit unit, // 4 BlockingQueue<Runnable 阅读全文
posted @ 2021-01-06 15:30 天宇轩-王 阅读(343) 评论(0) 推荐(0)
摘要:死锁 死锁是什么?有什么危害? 什么是死锁 发生在并发中 首先你要知道,死锁一定发生在并发场景中。我们为了保证线程安全,有时会给程序使用各种能保证并发安全的工具,尤其是锁,但是如果在使用过程中处理不得当,就有可能会导致发生死锁的情况。 互不相让 死锁是一种状态,当两个(或多个)线程(或进程)相互持有 阅读全文
posted @ 2021-01-05 22:25 天宇轩-王 阅读(303) 评论(0) 推荐(0)
摘要:JVM的四大引用 强引用 强引用时最普遍的引用。如果一个对象具有强引用,那垃圾回收器不会回收它。它是默认的引用类型,强引用的对象是可触及的,垃圾收集器就永远不会回收被引用的对象,它可能导致内存泄漏,可以直接访问目标对象。 软引用 只要被软引用关联的对象,系统将要发生内存溢出前,会把这些对象列进回收的 阅读全文
posted @ 2021-01-05 20:14 天宇轩-王 阅读(100) 评论(0) 推荐(0)
摘要:对象怎么定位 JVM是通过栈帧上的reference访问到对象的实例的,具体有2种方式。 句柄访问 优点:reference种存储稳定句柄地址,对象被移动时只会改变句柄中实例数据指针即可,reference本身不需要修改。 缺点:比较费空间,需要单独开辟一个句柄池。速度相比直接指针可能还要慢一点。 阅读全文
posted @ 2021-01-05 16:27 天宇轩-王 阅读(174) 评论(0) 推荐(0)
摘要:Spring框架的好处 轻量:Spring是轻量的,基本的版本约为几M。 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。 面向切面:Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。 容器:Spring包含并管理应用中对象的生命 阅读全文
posted @ 2021-01-05 15:47 天宇轩-王 阅读(112) 评论(0) 推荐(0)