文章 2024-08-21 来自:开发者社区

【多线程面试题十九】、 公平锁与非公平锁是怎么实现的?

面试官: 公平锁与非公平锁是怎么实现的?** 参考答案: 在Java中实现锁的方式有两种,一种是使用Java自带的关键字synchronized对相应的类或者方法以及代码块进行加锁,另一种是ReentrantLock,前者只能是非公平锁,而后者是默认非公平但可实现公平的一把锁。 ReentrantLock是基于其内部类FairSync(公平锁)和NonFairSync(非公平锁)实现的,并...

【多线程面试题十九】、 公平锁与非公平锁是怎么实现的?
文章 2024-08-21 来自:开发者社区

【多线程面试题十八】、说一说Java中乐观锁和悲观锁的区别

面试官:说一说Java中乐观锁和悲观锁的区别** 参考答案: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。Java中悲观锁是通过synchronized关键字或Lock接口来实现的。 乐观锁:顾名思义&#x...

文章 2024-08-21 来自:开发者社区

【多线程面试题十七】、如果不使用synchronized和Lock,如何保证线程安全?

面试官:如果不使用synchronized和Lock,如何保证线程安全?** 参考答案: 1、volatile volatile关键字为域变量的访问提供了一种免锁机制,使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新,因此每次使用该域就要重新计算,而不是使用寄存器中的值。需要注意的...

文章 2024-08-21 来自:开发者社区

【多线程面试题十六】、谈谈ReentrantLock的实现原理

面试官:谈谈ReentrantLock的实现原理** 参考答案: ReentrantLock是基于AQS实现的,AQS即AbstractQueuedSynchronizer的缩写,这个是个内部实现了两个队列的抽象类,分别是同步队列和条件队列。其中同步队列是一个双向链表,里面储存的是处于等待状态的线程,正在排队等待唤醒去获取锁,而条件队列是一个单向链表,里面储存的也是处于等待状态的线程,只不过...

【多线程面试题十六】、谈谈ReentrantLock的实现原理
文章 2024-08-21 来自:开发者社区

【多线程面试题十五】、synchronized可以修饰静态方法和静态代码块吗?

面试官:synchronized可以修饰静态方法和静态代码块吗?** 参考答案: synchronized可以修饰静态方法,但不能修饰静态代码块。 当修饰静态方法时,监视器锁(monitor)便是对象的Class实例,因为Class数据存在于永久代,因此静态方法锁相当于该...

文章 2024-08-21 来自:开发者社区

【多线程面试题十四】、说一说synchronized的底层实现原理

面试官:说一说synchronized的底层实现原理** 参考答案: 一、synchronized作用在代码块时,它的底层是通过monitorenter、monitorexit指令来实现的。 monitorenter:每个对象都是一个监视器锁(monitor),当monitor被占用时就会处于锁定状...

文章 2024-08-21 来自:开发者社区

【多线程面试题十三】、说一说synchronized与Lock的区别

面试官:说一说synchronized与Lock的区别** 参考答案: 1、synchronized是Java关键字,在JVM层面实现加锁和解锁;Lock是一个接口,在代码层面实现加锁和解锁。 2、synchronized可以用在代码块上、方法上;Lock只能写在代码里。 3、synchronized在代码执行完...

文章 2024-08-21 来自:开发者社区

【多线程面试题十二】、阻塞线程的方式有哪些?

面试官:阻塞线程的方式有哪些?** 参考答案: 当发生如下情况时,线程将会进入阻塞状态: 线程调用sleep()方法主动放弃所占用的处理器资源; 线程调用了一个阻塞式IO方法,在该方法返回之前,该线程被阻塞; 线程试图获得一个同步监视器,但该同步监视器正被其...

文章 2024-08-21 来自:开发者社区

【多线程面试题十一】、如何实现子线程先执行,主线程再执行?

面试官:如何实现子线程先执行,主线程再执行?** 参考答案: 启动子线程后,立即调用该线程的join()方法,则主线程必须等待子线程执行完成后再执行。 扩展阅读 Thread类提供了让一个线程等待另一个线程完成的方法——join()方法。当在某个程序执行流中调用其他线程的join()方法时,调用线程...

文章 2024-08-21 来自:开发者社区

【多线程面试题十】、说一说notify()、notifyAll()的区别

面试官:说一说notify()、notifyAll()的区别** 参考答案: notify() 用于唤醒一个正在等待相应对象锁的线程,使其进入就绪队列,以便在当前线程释放锁后竞争锁,进而得到CPU的执行。 notifyAll() 用于唤醒所有正在等待相应对象锁的线程,使它们进入就绪队列,以便在当前线...

本页面内关键词为智能算法引擎基于机器学习所生成,如有任何问题,可在页面下方点击"联系我们"与我们沟通。

Java面试那些事儿

手把手带您学习Java,开启编程之路。

+关注