一道简单的Java并发面试题,却因8个字错失阿里岗位,看到并发就慌

上周,小林终于在内推了3次之后接到了阿里的面试。为了这场面试,他准备了很久,还专门找朋友开了小灶。

然后面试的时候,面试官就问了一个非常简单的问题——“非公平锁和公平锁有什么区别?”听到这个问题,小林腰杆一下子就挺直了,张口就回答:“随机访问”、“插队访问””。

没想到,面试官对这个回答微微皱了一下眉毛……就这样,整个面试的氛围就沉了下来,后来面试也没持续多久就结束了。后来小林怎么都想不通自己错在哪,于是找了我。

他这么回答对不对?只能说,也没错。但如果我作为面试官,我最想听到的就是:非公平锁有两次抢锁机会,但是一旦进入队列,就永远排队。“一朝排队,永远排队。

上面的结论,是我通过分析公平锁和非公平锁lock方法的源码之后得出来的。

公平锁lock方法的源码分析

final void lock() {
    acquire(1);//1------标识加锁成功之后改变的值
}

非公平锁的lock方法

finalvoid lock() {
    if (compareAndSetState(0, 1))
       setExclusiveOwnerThread(Thread.currentThread());
    else
        acquire(1);
}

img

公平锁、非公平锁代码执行逻辑的区别

用一个例子来通俗讲解公平锁和非公平锁,那就是:

1、你去火车站买车票,大家都老老实实排队,你也跟着排队,非常公平合理,这就是公平锁

扫描二维码关注公众号,回复: 11533156 查看本文章

2、你去火车站买车票,大家都老老实实排队,但你是个小混混,直接走到售票窗口,“给我一张票!”

结果1: 大家都不敢吭声,售票员直接把票卖给你了;抢锁成功

结果2: 又来了一个小混混,把你按在地上一顿摩擦,他插队买票,你乖乖到后面排队;抢锁失败

很多人认为非公平锁插队就是永远在插队,实际上只要它第一次加锁失败之后,一旦进入队列,跟公平锁就没有区别了。

为什么阿里巴巴、美团经常会问你这些看起来很简单的面试题?因为这些看似简单的题目,面试官可以从你的回答里看出你的真实水平。

Java中有各种各样的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率!从互斥锁/读写锁、乐观锁/悲观锁、自旋锁、分段锁…再到JDK锁、分布式锁,你对Java中的锁了解多少?今天在这分享Java面试必备的技术:并发编程!一篇文章也很难全部写完,所以在这整理这份并发编程学习笔记手册,非常适合在准备秋招的朋友复习总结!

并发编程笔记分为4个模块

由于这份笔记的字数过多, 这份笔记已收录到github:https://github.com/ThinkingHan/Java-back-end-note,有需要的朋友可以来免费获取学习

第一模块目录

  • 进程与线程
  • Java线程
  • 共享模型之管程
  • 共享模型之内存
  • 共享模型之无锁
  • 共享模型之不可变
  • 共享模型之工具

img

img

内容展示:

img

第二模块目录

  • 同步模式之保护性暂停
  • 同步模式之Balking
  • 同步模式之顺序控制
  • 异步模式之生产者/消费者
  • 异步模式之工作线程
  • 终止模式之两阶段终止模式
  • 线程安全单例
  • 享元模式

img

内容展示

img

第三模块目录

img

内容展示

img

第四模块目录

  • 指令级并行原理
  • CPU缓存结构原理
  • volatile原理
  • final原理
  • Monitor原理
  • synchronized原理
  • synchronized原理进阶
  • wait notify原理
  • join原理
  • park unpark原理
  • AQS原理
  • ReentrantLock原理
  • 读写锁原理
  • Semaphore原理
  • ConcurrentHashMap原理
  • LinkedBlockingQueue原理
  • ConcurrentLinkedQueue原理

img

内容展示

img

由于这份笔记的字数过多, 这份笔记已收录到github:https://github.com/ThinkingHan/Java-back-end-note,有需要的朋友可以来免费获取学习

猜你喜欢

转载自blog.csdn.net/rxh811/article/details/107288631