Java多线程与远程调用分享-邢晓兵

需积分: 9 0 下载量 136 浏览量 更新于2024-08-18 收藏 1.73MB PPT 举报
"邢晓兵在2017年1月的部门分享中,主题聚焦于多线程,包括基本理论、同步工具、线程池等关键概念。分享中提到了几种实现线程同步和通信的方式,如FutureTask、CountDownLatch以及wait/notify机制,并深入探讨了AQS(AbstractQueuedSynchronizer)及其应用。此外,还讨论了线程关闭、T级数据搬家等相关话题。" 在多线程编程中,发起远程调用经常涉及线程的同步和管理。以下是一些核心知识点的详细说明: 1. **阻塞当前线程的方法**: - **FutureTask**: 是一个可以取消的异步计算任务,它实现了RunnableFuture接口,允许你获取或检查计算结果,同时也可以取消任务。 - **CountDownLatch**: 是一个同步辅助类,它允许一个或多个线程等待其他线程完成操作。计数器初始值为给定的整数,在计数器归零前,await() 方法会阻塞所有线程;一旦计数器归零,所有等待的线程都会被释放。 - **wait/notify**: 这是Java对象监视器方法,用于线程间通信。wait() 使当前线程进入等待状态,直到其他线程调用同一对象的notify() 或 notifyAll() 方法将其唤醒。 2. **AQS (AbstractQueuedSynchronizer)**: - AQS 是一个框架,用于构建锁和其他同步组件,如ReentrantLock、Semaphore等。它基于一个整型状态字段(state)和一个FIFO等待队列来实现线程同步。 - **独占与共享模式**:AQS 支持两种模式,独占模式(如锁)和共享模式(如信号量)。tryAcquire 和 tryRelease 用于独占模式,tryAcquireShared 和 tryReleaseShared 用于共享模式。 - **SYN队列与condition队列**:SYN队列是等待获取锁的线程形成的FIFO队列,而condition队列则用于线程等待特定条件满足后被唤醒。 3. **线程关闭**:在Java中,线程的终止可以通过中断(interrupt)、退出代码(return)或者显式停止(例如,使用Future的cancel方法)。 4. **线程池**: - 线程池提高了效率,避免频繁创建和销毁线程的开销。当任务是同类型且相互独立时,线程池表现最佳。但是,如果任务速度不一致或者存在依赖,可能会导致线程等待,影响性能。 - 使用线程池的注意事项包括:合理设置线程池大小,考虑任务性质,以及确保worker线程能快速响应新任务。 5. **并发容器**: - 如ConcurrentHashMap,采用了分段锁策略,减少了锁竞争,适合读多写少的场景。它通过特殊的HashEntry设计和条件判断,保证了并发环境下的高效访问。 6. **线程状态与上下文切换**: - 线程状态包括新建、运行、等待、阻塞和终止。上下文切换是指CPU从一个线程的执行状态切换到另一个线程,这涉及到保存和恢复寄存器、栈等信息,每次上下文切换都有一定的开销。 7. **锁的原则**: - 无锁同步:尽可能避免使用锁,减少锁的使用可以降低竞态条件和死锁的风险。 - 缩短锁的持有时间:尽量让线程快速完成其持有锁的操作,减少其他线程等待的时间。 - 降低线程请求锁的频率:优化代码逻辑,减少对锁的频繁请求。 这些知识点构成了Java多线程编程的基础,理解和掌握它们对于编写高效的并发代码至关重要。