JVM:
1. JVM的内存划分
2. 什么情况下会导致JVM栈溢出
3. 垃圾回收的常见算法
4. 什么样的对象会直接进入老年代
Java基础:
5. StringBuffer和StringBuilder区别
6. 有没有看StringBuilder的源码,多线程时StringBuilder为什么不安全,可不可以举个例子
7. StringBuffer怎么上锁的
StringBuffer 是线程安全的,其内部的方法都是使用 synchronized 关键字进行同步的,以保证多个线程同时访问 StringBuffer 对象时的线程安全性。
当一个线程获取了 StringBuffer 对象的锁之后,其他线程将被阻塞等待锁的释放,直到获取到锁才能访问该对象。这样就能保证在多线程环境下,对 StringBuffer 对象的操作是同步的,不会出现数据竞争和数据不一致的情况。
8. 自己项目中有没有用到这个上锁的方法
9. synchronized的锁状态,可以降级吗
10. 了解volatile关键字吗
11. 可重用锁的实现原理
重用锁:一个线程,如果抢占了互斥锁资源,而在锁释放之前,再去竞争同一把锁的时候,不需要等待只需要记录重入次数就可以了。
可重用锁(ReentrantLock)是一种可重入锁,可以被同一个线程多次获取锁,而不会导致死锁。它的实现原理主要依赖于以下几个方面:
CAS(Compare and Swap)操作:可重用锁的实现依赖于原子操作,也就是 CAS 操作。CAS 操作是一种无阻塞的原子操作,它通过比较内存地址中的值和预期值是否相等,来决定是否更新内存地址中的值。如果内存地址中的值和预期值相等,则将新值写入内存地址中,否则不做任何操作。
线程等待队列:可重用锁会为每个等待线程创建一个节点,将节点加入到等待队列中。当一个线程尝试获取锁时,如果锁已被其他线程占用,则将该线程的节点加入到等待队列中,并将该线程挂起。当锁被释放时,将从等待队列中唤醒一个线程继续执行。
锁的状态:可重用锁维护了一个状态变量,表示锁的状态。当一个线程获取锁时,如果锁未被占用,则将锁的状态设置为已占用,并将持有锁的线程设置为当前线程。如果锁已被占用,则判断持有锁的线程是否为当前线程,如果是,则将锁的状态加 1,并返回 true;否则将线程加入到等待队列中,并将该线程挂起。
重入计数器:可重用锁维护了一个重入计数器,用于记录当前线程获取锁的次数。当一个线程获取锁时,如果锁已被该线程占用,则将重入计数器加 1,并返回 true;否则将锁的状态设置为已占用,并将持有锁的线程设置为当前线程,并将重入计数器设置为 1。
综上所述,可重用锁的实现原理主要依赖于 CAS 操作、线程等待队列、锁的状态和重入计数器等机制,通过这些机制可以实现可重入锁,并且可以避免死锁的问题。
https://www.zhihu.com/zvideo/1526976773321891840
12. AQS中线程之间同步的方法
13. 线程池的七大参数
数据库
14. 索引失效的几种情况
15. MySQL的redolog
16. MySQL的两阶段提交
17. 有没有遇到过数据库死锁,举个例子
https://juejin.cn/post/7072000882128191518
项目相关:
一些项目的问题。。。
其他:
18. 用过feignclind吗
19. 微服务中的服务与服务的互相调用是怎么实现的
20. 了解过RabbitMQ吗,用过吗
21. 查看文件最后几百行的Linux命令
22. 查看JVM内存的命令
23. 口述跳台阶的思路
24. 实际用过哪些设计模式
25. spring bean的生命周期
转载:
标签:重入,队列,StringBuffer,面经,重用,联想,线程,转载,等待 From: https://www.cnblogs.com/chenyi502/p/17369248.html