欢迎光临
我们一直在努力

Java多线程

本文梳理Java多线程基础、实现方式、线程状态、同步机制、线程通信、线程池、并发集合等核心内容,适配日常开发与面试备考。

一、进程与线程

1. 进程:操作系统中独立运行的应用程序,系统支持多进程并发。宏观上并行执行,微观上交替占用CPU时间片串行运行。

2. 线程:进程内独立执行的任务单元,也称轻量级进程,一个进程可包含多个线程。

3. 主线程:由main方法启动,伴随main方法起止。

4. 内存特点:栈空间线程独立(存储局部变量),堆空间线程共享(存储对象)。

二、多线程三种实现方式(重点/面试)

1. 继承 Thread 类

• 自定义类继承Thread,重写run()方法。

• 创建线程对象,调用start()启动线程(自动执行run())。

2. 实现 Runnable 接口

• 自定义类实现Runnable,重写run()方法。

• 将实现类对象传入Thread构造器,调用start()启动。

• 优势:避免单继承局限,适合多线程共享资源。

3. 实现 Callable 接口(JDK5+)

• 位于java.util.concurrent,重写call(),支持返回值、可抛出异常。

• 需配合线程池和Future接收执行结果,支持异步调用。

三、线程生命周期与常用方法

1. 五大状态:新建(New) → 就绪(Ready) → 运行(Running) → 阻塞(Blocked) → 终止(Terminated),还有限时/无限等待状态。

2. sleep(long ms):线程休眠,进入限时等待;释放CPU,不释放锁。

3. join():让其他线程优先执行,当前线程进入无限等待。

四、线程同步(解决并发安全问题)

1. 临界资源:多线程共享的对象;原子操作:不可拆分的完整操作。

2. 同步目的:保证临界资源数据安全,防止原子操作被打断。

3. 同步代码块

◦ 语法:synchronized(锁对象){ 共享代码 },写在方法内部。

◦ 规则:同一时间仅一个线程获取锁,执行完毕才释放;无锁线程进入阻塞。

4. 同步方法

◦ 使用synchronized修饰方法,默认锁为this当前对象。

五、线程间通信

依托Object类三大方法,必须在同步代码块/同步方法中调用:

1. wait():线程进入无限等待,释放CPU + 释放锁。

2. notify():随机唤醒一个等待线程,不释放锁。

3. notifyAll():唤醒所有等待线程,不释放锁。

面试考点:sleep 与 wait 区别

• sleep:限时等待,释放CPU,不释放锁。

• wait:无限等待,释放CPU,同时释放锁。

六、线程池(开发常用)

1. 核心作用:复用线程,减少频繁创建、销毁线程的开销,提升性能。

2. 核心API(java.util.concurrent)

◦ Executor:顶级根接口;ExecutorService:常用子接口。

◦ 常用方法:submit()提交任务、shutdown()关闭线程池。

3. 工具类 Executors

◦ newFixedThreadPool(n):固定线程数量的线程池。

◦ newCachedThreadPool():动态扩容的缓存线程池。

七、锁体系拓展

1. Lock 接口(java.util.concurrent.locks)

◦ 比synchronized更灵活,手动加锁lock()、手动解锁unlock()(建议写在finally)。

◦ 实现类:ReentrantLock(可重入锁)。

2. 读写锁 ReadWriteLock

◦ 实现类:ReentrantReadWriteLock,分为读锁、写锁。

◦ 规则:读读不互斥,读写、写写、写读均互斥。

◦ 适用:读多写少场景,大幅提升效率。

八、并发集合(面试高频)

1. 普通集合对比

• ArrayList/HashMap:线程不安全,效率高。

• Vector/Hashtable:方法加同步锁,线程安全,效率低。

2. 高并发专用集合(java.util.concurrent)

1. CopyOnWriteArrayList

◦ 线程安全;写时拷贝新容器,读写不互斥。

◦ 特点:读多写少场景性能优异,写操作效率偏低。

2. ConcurrentLinkedQueue:基于CAS实现,线程安全的队列。

3. ConcurrentHashMap

◦ 分段锁思想,缩小锁粒度,降低锁竞争,并发效率高。

◦ 不允许null键/值;HashMap允许存null。

3. 队列 Queue

• 特点:先进先出(FIFO)。

• BlockingQueue:阻塞队列,常用实现ArrayBlockingQueue、LinkedBlockingQueue。

4. 工具方法

Collections.synchronizedXxx():可将非线程安全集合转为同步集合。

九、高频面试题速记

1. 多线程三种实现:继承Thread、实现Runnable、实现Callable+线程池。

2. sleep() 和 wait() 核心区别:锁是否释放。

3. ArrayList vs Vector / HashMap vs Hashtable:线程安全与效率取舍。

4. CopyOnWriteArrayList:写拷贝、读写不互斥,读多写少优选。

5. ConcurrentHashMap:分段锁,线程安全且并发性能优秀。

 

赞(0)
未经允许不得转载:171主机测评 » Java多线程
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址