软件与硬件基础:多线程编程及多处理器架构解析
1. 软件基础
1.1 Java 编程中的线程问题
在 Java 编程里,会遇到诸如丢失唤醒问题这类情况。比如,当 S 将一个调用放入队列并调用 notify() 来唤醒一个操作线程时,由于通知是异步的,会存在延迟。S 返回后又将另一个调用放入队列,此时若队列已有等待调用,就不会再通知其他线程。最终,总机的 notify() 生效,唤醒了 A 线程,但 B 线程即使有调用需要处理也未被唤醒。这就是丢失唤醒问题,即一个或多个等待线程未能收到其等待条件已满足的通知。
1.1.1 线程的暂停操作
除了 wait() 方法能让持有锁的线程释放锁并暂停外,Java 还提供了其他方式让未持有锁的线程暂停:
- yield() 调用:暂停当前线程,请求调度器运行其他线程。调度器决定是否暂停该线程以及何时重启。若没有其他线程可运行,调度器可能会忽略 yield() 调用。
- sleep(t) 调用:指示调度器在指定的时间 t 内不运行该线程,调度器可在之后的任意时间重启该线程。
1.1.2 线程局部对象
在 Java 中,每个线程拥有自己的私有变量实例往往很有用。Java 通过 ThreadLocal<T> 类来支持线程局部对象,该类为每个线程管理一个类型为 T 的对象集合。不过,线程局部变量并非 Java 内
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



