编辑
2024-08-26
面试题库
0

Condition 的作用:

线程等待: 线程可以调用 await 方法进入等待状态,释放锁,并等待其他线程的通知。

线程通知: 线程可以调用 signal 或 signalAll 方法唤醒一个或所有正在等待的线程。

线程信号: 线程可以调用 signal 方法唤醒一个正在等待的线程,即使该线程尚未满足等待条件。

线程阻塞: 线程可以调用 await 方法进入等待状态,并阻塞当前线程,直到收到通知或超时。

编辑
2024-08-26
面试题库
0

AQS 的作用:

同步状态管理: AQS 提供了 getState、setState 和 compareAndSetState 等方法,用于管理同步组件的同步状态,例如锁的状态、信号量计数等。

线程等待/通知机制: AQS 提供了 enqueue、dequeue、acquire、release 和 signal 等方法,用于实现线程的等待/通知机制,例如将线程放入等待队列、唤醒线程等。

构建同步组件的框架: AQS 提供了构建同步组件所需的通用代码,例如线程安全队列、自旋锁等,简化了自定义同步组件的开发。

构建自定义同步组件:

继承 AQS: 自定义同步组件需要继承 AQS 类。

重写钩子方法: 自定义同步组件需要重写 AQS 中的钩子方法,例如 tryAcquire、tryRelease、tryAcquireShared、tryReleaseShared 等,用于实现同步组件的具体逻辑。

使用 AQS 提供的方法: 自定义同步组件可以使用 AQS 提供的方法,例如 getState、setState、acquire、release 等,来管理同步状态和线程等待/通知。

创建同步组件实例: 通过继承 AQS 并重写钩子方法,可以创建自定义同步组件的实例,例如 ReentrantLock、Semaphore、CountDownLatch 等。

编辑
2024-08-26
面试题库
0

可中断的锁:

Lock 支持可中断的锁操作,线程可以通过 lockInterruptibly 方法获取锁,并在等待过程中可以被中断。 这意味着线程在获取锁时,可以响应其他线程的中断请求,避免死锁的发生。

公平锁与非公平锁:

Lock 可以创建公平锁和非公平锁。公平锁保证线程按照请求锁的顺序获取锁,而非公平锁则允许线程插队,提高系统吞吐量。

锁降级:

Lock 支持锁降级,即持有写锁的线程可以先获取读锁,然后再释放写锁。这可以用于实现复杂的业务逻辑,例如在写操作之前检查数据是否发生变化。

等待/通知机制:

Lock 可以与 Condition 接口配合使用,实现线程之间的等待/通知机制。Condition 提供了 await 和 signal 等方法,可以更灵活地控制线程的等待和通知。

超时获取锁:

Lock 提供了 tryLock 方法,线程可以尝试在指定时间内获取锁,并在超时后返回。这可以用于实现超时控制,避免线程无限期地等待锁。

强大的锁粒度:

Lock 可以以更细粒度控制锁的范围,例如可以针对数组的不同元素分别加锁。

编辑
2024-03-08
面试题库
0

ThreadLocal 原理

ThreadLocal 中有一个内部类ThreadLocalMap,用于存储线程局部变量。ThreadLocalMap 是一个 HashMap,其 Key 是 ThreadLocal 实例,Value 是线程本地变量。每个 Thread 实例内部都包含一个 ThreadLocalMap。当线程调用 ThreadLocal 的 set 方法时,会将值存储在当前线程的 ThreadLocalMap 中。当线程调用 ThreadLocal 的 get 方法时,会从当前线程的 ThreadLocalMap 中获取对应的值。由于每个线程都有自己的 ThreadLocalMap,因此实现了线程隔离,避免了线程间的数据共享。

ThreadLocal 的作用

线程隔离: ThreadLocal 为每个线程提供一个独立的变量副本,避免了多线程环境下共享变量带来的问题,例如线程安全问题、数据竞争等。

数据传递: ThreadLocal 可以方便地在同一个线程的不同函数之间传递数据,避免了通过参数传递带来的耦合。

避免使用全局变量: ThreadLocal 可以避免使用全局变量,减少全局变量的作用范围,提高代码的可维护性。

编辑
2024-03-07
面试题库
0

volatile 的优点

轻量级: volatile 不需要依赖于操作系统线程调度,其操作由 CPU 的原子指令完成,开销比 synchronized 小。

简单易用: volatile 的语法简单,使用方便,不需要显式地获取和释放锁。

内存可见性保证: volatile 变量的读写操作具有原子性,可以保证内存可见性,即一个线程对共享变量的修改对其他线程立即可见。

volatile 的缺点

不保证原子性: volatile 变量的单个读/写操作具有原子性,但类似于 volatile++ 这样的复合操作不具有原子性,需要其他机制保证。

无法防止竞争条件: volatile 无法防止多个线程同时访问共享资源时发生竞争条件,需要其他同步机制保证线程安全。