面试多线程八股文五问五答第四期

面试多线程八股文五问五答第四期

作者:程序员小白条,个人博客

相信看了本文后,对你的面试是有一定帮助的!

⭐点赞⭐收藏⭐不迷路!⭐

1)Java 如何实现多线程之间的通讯和协作?

  • 使用共享变量:多个线程共享一个变量,通过对变量的读写操作来进行通讯和协作。
  • 使用 wait()、notify()和notifyAll()方法:线程可以通过调用wait()方法来等待某个条件的满足,其他线程可以通过notify()或notifyAll()方法来通知等待的线程条件已经满足。
  • 使用 Lock 和 Condition:通过Lock和Condition接口可以实现更灵活的线程通讯和协作,可以精确地控制线程的等待和唤醒。

2)Thread 类中的 yield 方法有什么作用?

Thread类中的yield方法的作用是让出当前线程的CPU执行时间,给其他具有相同优先级的线程执行的机会。调用yield方法会使当前线程从运行状态转为就绪状态,然后调度器会从就绪状态的线程中选择一个执行。

3)为什么说 Synchronized 是非公平锁?

Synchronized是非公平锁的原因是因为它不保证线程获取锁的顺序与它们发出请求的顺序完全一致。当多个线程同时竞争一个锁时,Synchronized会选择任意一个线程来获取锁,而不是按照线程的请求顺序来选择。

4)请谈谈 volatile 有什么特点,为什么它能保证变量对所有线程的可见性?

  • 保证可见性:当一个线程修改了volatile修饰的变量的值,其他线程可以立即看到最新的值。
  • 不保证原子性:volatile修饰的变量只能保证可见性,不能保证原子性,即不保证多个线程同时对变量进行读写的操作是原子性的。
  • 不能保证有序性:volatile修饰的变量只能保证可见性,不能保证指令的执行顺序。

volatile可以保证变量对所有线程的可见性是因为它使用了内存屏障(Memory Barrier)的机制。当一个线程修改了volatile修饰的变量的值时,会立即将该值刷新到主内存中,其他线程在读取该变量时会先从主内存中获取最新的值,确保了所有线程对变量的操作都是基于最新的值。

5)为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?

Synchronized是一个悲观锁的原因是它假设在多线程环境下会发生竞争,因此默认情况下会阻塞其他线程的访问,以保证数据的一致性。Synchronized使用了互斥锁的机制,线程在访问同步代码块之前需要先获取锁,其他线程在获取不到锁的情况下会被阻塞。

乐观锁的实现原理是基于版本号或时间戳的机制。在乐观锁中,每个线程在修改数据之前会先获取数据的版本号或时间戳,然后在写入数据时会比较版本号或时间戳是否发生了变化,如果没有变化则说明数据没有被其他线程修改过,可以进行写入操作;如果发生了变化则说明数据已经被其他线程修改过,当前线程需要重新获取最新的数据并重新进行操作。乐观锁通过避免线程阻塞和等待来提高并发性能,但是需要对数据的一致性进行额外的控制。

你可能感兴趣的:(面试八股文系列,面试,职场和发展,java,多线程,八股文,操作系统)