1> Synchronized与ReentrantLock的区别是什么?
| 区别 | Synchronized | ReentrantLock |
|---|---|---|
| 使用方式 | 关键字 | 实现类 |
| 实现方式 | JVM | AQS |
| 是否自动 | yes | no |
| 获取锁 | 只要资源被锁,会一直等待 | 针对资源被锁,是有多种处理方式的。 |
| 释放锁 | 1> 代码执行完毕。 2> 发生异常 | 手工去释放锁。fianlly |
| 锁的状态 | 没办法判断 | 可以的。isLocked() |
| 锁的类型 | 可重入,不可中断,非公平锁。 | 可重入(Re-entrant-Lock),可以中断(lockInterruptibly),公平锁or非公平锁。 |
区别:
2> ReentrantLock的加锁方式有几种?分别是什么?
-
lock()
如果锁不可用(没抢到),出入线程调度的目的,当前的线程将会被禁用到。处于休眠状态,直到获得锁。
-
boolean tryLock()
如果获得到锁了,那么返回true。 如果没有获取到锁,那么立刻返回false。
-
boolean tryLock(long timeout, TimeUnit unit)
如果获得到锁了,那么返回true。如果没有获取到锁,出入线程调度的目的,当前的线程将会被禁用到,处于休眠状态,直到发生下面几种情况:
1> 已经获得了锁,之前的锁已经被释放了。
2> 其他一些线程中了当前的线程。
3> timeout,unit 时间到了。
-
void lockInterruptibly()
如果获得到锁了,那么返回true。如果没有获取到锁,出入线程调度的目的,当前的线程将会被禁用到,处于休眠状态,直到发生下面几种情况:
1> 已经获得了锁,之前的锁已经被释放了。
2> 其他一些线程中断了当前的线程,它是支持中断获取锁。
3> 什么是xx锁?xx锁与yy锁有什么区别?
-
公平锁/非公平锁 (FairSync/NotfairSync)
公平锁:公平的获取锁,按顺序来获取锁。排队去。 FairSync,源码里会介绍。
非公平锁:与公平锁想法。NotfairSync,源码里会介绍。
-
独占锁/共享锁 (Read-Write-Lock 写入时——> 独占锁 读取时——> 共享锁)
独占锁:只有一个线程可以访问。
共享锁:有N个线程可以访问。
-
互斥锁/读写锁
互斥锁:ReentrantLock。
读写锁:Read-Write-Lock
-
乐观锁/悲观锁
乐观锁:乐观,不认为会发生问题。效率肯定会高,实现会很复杂。
悲观锁:认为肯定会发生问题。ReentrantLock,Synchronized。效率低,实现简单。
-
偏向锁/轻量级锁/重量级锁
偏向锁——>轻量级锁——>重量级锁 (递增的一个锁的进化状态,游戏里的升级。Level Up!)
-
偏向锁
一个块代码块,一直被一个线程所访问。线程就会自动获得锁,降低获得锁的代价。
-
轻量级锁
前提,现在的锁就是偏向锁,被另一线程所访问。它就升级为轻量级锁。
-
重量级锁
前提,轻量级锁,另一个线程是自旋的,但是自旋一定次数之后,还没有获得这个锁,那么就会进入阻塞状态。这个时候,锁就升级为了重量级锁。
-
-
重入锁 (ReentrantLock)
ok
-
分段锁 (ConcurrentHashMap)
分段。面试问题:ConcurrentHashMap是怎么实现的
-
自旋锁
获得锁的时候,不会立刻阻塞,而是采用自旋的方式获取锁。
优点:减少线程的上下文切换。
缺点:对CPU有较大的消耗。
4> 什么是AQS?
5> AQS定义的资源共享方式有几种?分别是什么?
6> 什么是SMP架构、NUMA架构?什么是CLH锁模型、MCS锁模型?
-
SMP(Symmetric Multi-Processor)多处理器结构
对称多处理器结构,指服务器中多个CPU对称工作,每个CPU访问内存地址所需时间相同。其主要特征是共享,包含对CPU,内存,I/O等进行共享。
SMP能够保证内存一致性,但这些共享的资源很可能成为性能瓶颈,随着CPU数量的增加,每个CPU都要访问相同的内存资源,可能导致内存访问冲突,可能会导致CPU资源的浪费。常用的PC机就属于这种。
-
NUMA(Non-Uniform Memory Access)非一致存储访问结构
非一致存储访问,将CPU分为CPU模块,每个CPU模块由多个CPU组成,并且具有独立的本地内存、I/O槽口等,模块之间可以通过互联模块相互访问,
访问本地内存的速度将远远高于访问远地内存(系统内其它节点的内存)的速度,这也是非一致存储访问的由来。NUMA较好地解决SMP的扩展问题,
当CPU数量增加时,因为访问远地内存的延时远远超过本地内存,系统性能无法线性增加。
- MPP(Massive Parallel Processing)海量并行处理结构
-
什么是CLH锁模型(吃了哈)
是一个自旋锁,能确保无饥饿性,提供先来先服务的公平性。
CLH锁也是一种基于链表的可扩展、高性能、公平的自旋锁,申请线程只在本地变量上自旋,它不断轮询前驱的状态,如果发现前驱释放了锁就结束自旋。
-
什么是MCS锁模型 (MCS)
与CLH最大的不同并不是链表是显示还是隐式,而是线程自旋的规则不同:CLH是在前趋结点的locked域上自旋等待,而MCS是在自己的结点的locked域上自旋等待。正因为如此,它解决了CLH在NUMA系统架构中获取locked域状态内存过远的问题。