相信看了本文后,对你的面试是有一定帮助的!
?点赞?收藏?不迷路!?
1)Java 如何实现多线程之间的通讯和协作?
2)Thread 类中的 yield 方法有什么作用?
Thread类中的yield方法的作用是让出当前线程的CPU执行时间,给其他具有相同优先级的线程执行的机会。调用yield方法会使当前线程从运行状态转为就绪状态,然后调度器会从就绪状态的线程中选择一个执行。
3)为什么说 Synchronized 是非公平锁?
Synchronized是非公平锁的原因是因为它不保证线程获取锁的顺序与它们发出请求的顺序完全一致。当多个线程同时竞争一个锁时,Synchronized会选择任意一个线程来获取锁,而不是按照线程的请求顺序来选择。
4)请谈谈 volatile 有什么特点,为什么它能保证变量对所有线程的可见性?
volatile可以保证变量对所有线程的可见性是因为它使用了内存屏障(Memory Barrier)的机制。当一个线程修改了volatile修饰的变量的值时,会立即将该值刷新到主内存中,其他线程在读取该变量时会先从主内存中获取最新的值,确保了所有线程对变量的操作都是基于最新的值。
5)为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?
Synchronized是一个悲观锁的原因是它假设在多线程环境下会发生竞争,因此默认情况下会阻塞其他线程的访问,以保证数据的一致性。Synchronized使用了互斥锁的机制,线程在访问同步代码块之前需要先获取锁,其他线程在获取不到锁的情况下会被阻塞。
乐观锁的实现原理是基于版本号或时间戳的机制。在乐观锁中,每个线程在修改数据之前会先获取数据的版本号或时间戳,然后在写入数据时会比较版本号或时间戳是否发生了变化,如果没有变化则说明数据没有被其他线程修改过,可以进行写入操作;如果发生了变化则说明数据已经被其他线程修改过,当前线程需要重新获取最新的数据并重新进行操作。乐观锁通过避免线程阻塞和等待来提高并发性能,但是需要对数据的一致性进行额外的控制。