面试总结:总体不难,算法题脑抽了只过了一半,面试官点出了问题说时间到了,反问一点点,感觉五五开,许愿一个二面
1.Java中的锁机制,什么是可重入锁
Java中的机制主要包括
-
synchronized
关键字 -
Lock接口及其实现类(
如ReentrantLock
) -
原子类(如
AtomicInteger
) -
volatile关键字,仅保证可见性和有序性
可重入锁
可重入锁是指同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁,不会因为之前已经获取过还没释放而阻塞。Java中ReentrantLock
和synchronized
都是可重入锁。
可重入锁的实现原理:
- 记录锁的持有线程
- 维护一个计数器
- 当计数器为0时,表示锁没有被任何线程持有
- 当持有锁的线程再次请求锁时,计数器+1
- 当线程退出同步代码块时,计数器-1
- 计数器为0时释放锁
可重入锁的优点:
- 避免死锁
- 提高了锁的灵活性
2.AQS (AbstractQueuedSynchronizer)
AQS是Java并发包中的核心基础组件,用于构建锁或者其他同步组件。
AQS使用一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。
AQS的核心思想:
- 如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。
- 如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制。
AQS的主要方法:
acquire(int)
: 独占式获取同步状态release(int)
: 独占式释放同步状态acquireShared(int)
: 共享式获取同步状态releaseShared(int)
: 共享式释放同步状态
AQS的实现:
- 使用一个
volatile
的int类型的成员变量来表示同步状态 - 使用一个FIFO队列来完成资源获取的排队工作
- 使用
CAS
来原子性地修改同步状态值
AQS的应用:
- ReentrantLock
- Semaphore
- CountDownLatch
- ReentrantReadWriteLock
- ThreadPoolExecutor
3.Redis相关数据结构,为什么每种数据类型一般都有两种数据结构?
Redis的主要数据结构