加油小丫头

175 阅读5分钟

1> Synchronized与ReentrantLock的区别是什么?

区别SynchronizedReentrantLock
使用方式关键字实现类
实现方式JVMAQS
是否自动yesno
获取锁只要资源被锁,会一直等待针对资源被锁,是有多种处理方式的。
释放锁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机就属于这种。

image-20201218173514868.png

  • NUMA(Non-Uniform Memory Access)非一致存储访问结构

    非一致存储访问,将CPU分为CPU模块,每个CPU模块由多个CPU组成,并且具有独立的本地内存、I/O槽口等,模块之间可以通过互联模块相互访问,

    访问本地内存的速度将远远高于访问远地内存(系统内其它节点的内存)的速度,这也是非一致存储访问的由来。NUMA较好地解决SMP的扩展问题,

    当CPU数量增加时,因为访问远地内存的延时远远超过本地内存,系统性能无法线性增加。

image-20201218173701727.png

  • MPP(Massive Parallel Processing)海量并行处理结构

image-20201218173801759.png

  • 什么是CLH锁模型(吃了哈)

    是一个自旋锁,能确保无饥饿性,提供先来先服务的公平性。

    CLH锁也是一种基于链表的可扩展、高性能、公平的自旋锁,申请线程只在本地变量上自旋,它不断轮询前驱的状态,如果发现前驱释放了锁就结束自旋。

image-20201218173227567.png

  • 什么是MCS锁模型 (MCS)

    与CLH最大的不同并不是链表是显示还是隐式,而是线程自旋的规则不同:CLH是在前趋结点的locked域上自旋等待,而MCS是在自己的结点的locked域上自旋等待。正因为如此,它解决了CLH在NUMA系统架构中获取locked域状态内存过远的问题。

image-20201218173403312.png