Java并发编程:线程池、ThreadLocal、锁机制与原子操作

需积分: 10 1 下载量 67 浏览量 更新于2024-07-15 收藏 20.35MB DOCX 举报
"该文档是关于Java并发编程的学习笔记,涵盖了线程池、ThreadLocal、锁机制、原子类以及CAS的相关知识。" 一·线程池 线程池是Java并发编程中常用的一种优化手段,通过复用已存在的线程来减少创建和销毁线程的开销。使用线程池可以更好地控制系统的资源,提高系统性能,并且提供了处理拒绝任务的策略。JDK内置了四种线程池: 1. FixedThreadPool:固定大小的线程池,核心线程数等于最大线程数,使用无界链表阻塞队列,可能导致内存溢出(OOM)。 2. CachedThreadPool:可缓存线程池,核心线程数为0,最大线程数为Integer.MAX_VALUE,使用直接交接队列,线程执行完后存活60秒后会被回收。 3. ScheduledThreadPool:支持定时及周期性任务的线程池,适用于计划任务的执行。 4. 比较:不同线程池适用于不同的场景,如FixedThreadPool适合任务量稳定的场景,而CachedThreadPool适合短生命周期的任务。 二·ThreadLocal ThreadLocal是每个线程独享变量的工具类,常用于避免在多线程环境下传递全局变量。使用ThreadLocal可以简化代码,但需要注意内存泄漏问题,当不再使用ThreadLocal时,应将其设置为null以释放引用。 三·锁 Java提供了多种锁机制,包括Lock接口和synchronized关键字。Lock提供了更细粒度的控制,可以显式地获取和释放锁。锁的分类包括: 1. 乐观锁与悲观锁:乐观锁假设很少发生冲突,通常不加锁;悲观锁则假设冲突频繁,采用加锁机制。 2. 可重入锁:允许一个线程多次获取同一锁,如synchronized。 3. 公平锁与非公平锁:公平锁保证按照请求顺序获取锁,而非公平锁则可能让某些线程提前获取锁。 4. 共享锁和排它锁:读写锁中的读锁是共享的,允许多个读取操作同时进行;写锁是排它的,只有一个写操作能执行。 四·atomic Java的原子类如AtomicInteger、AtomicLong等提供了一种高效、线程安全的数值操作方式,它们使用CAS(Compare and Swap)技术实现。原子类可以避免使用synchronized进行同步,降低锁的使用开销。AtomicLong与LongAdder、LongAccumulator等累加器类在高并发下表现更优。 五·CAS CAS是一种无锁算法,通过比较并交换值来实现原子操作。它避免了锁带来的开销,但在高竞争环境下可能导致自旋浪费CPU资源。Java通过AtomicStampedReference解决ABA问题,引入时间戳来确保更新的原子性。 总结,Java并发编程涉及面广,从线程池的管理到线程局部变量的使用,再到各种锁机制和原子类的运用,都是为了在多线程环境中保证数据的一致性和程序的高效运行。理解并熟练掌握这些概念和技术,对于提升Java并发编程能力至关重要。