面试tips--并发--进程与线程的区别线程通信方式总结
一、线程与进程的区别
1、进程是操作系统分配资源的基本单位,线程是操作系统调度的基本单位
2、同一个进程下的多个线程,共享系统分配给进程的资源
区别点 进程 线程 概念 操作系统分配资源的基本单位,每个进程拥有独立的地址空间 进程的一个执行单元,同一进程内的线程共享进程资源 资源拥有 拥有独立的内存空间、文件句柄等系统资源 不独立拥有资源,依赖所在进程共享内存和文件句柄 开销 创建/销毁开销大,切换开销大(需要切换内存上下文) 创建/销毁开销小,切换开销小(线程切换不涉及内存页切换) 调度 由操作系统调度 由操作系统调度,也可由用户级线程库调度 通信方式 需要进程间通信(IPC):管道、Socket、共享内存、消息队列等 线程间通信可直接访问共享内存,也可使用消息传递 可靠性 一个进程崩溃不会直接影响其他进程 一个线程崩溃可能导致整个进程崩溃 适用场景 适合资源隔离、任务独立 适合高并发、任务紧密协作
二、线程间通信方式
线程是共享同一进程资源的,所以线程间通信方式主要有两类:
1. 共享内存
原理
线程可以直接读写进程内的共享数据(如全局变量、对象)。
因为存在并发访问,必须使用 同步机制 避免数据冲突。
Java示例
class Counter {private int count = 0;// synchronized保证线程安全public synchronized void increment() {count++;}public synchronized int getCount() {return count;} }public class ThreadSharedMemoryDemo {public static void main(String[] args) throws InterruptedException {Counter counter = new Counter();Runnable task = () -> {for(int i=0; i<1000; i++) {counter.increment();}};Thread t1 = new Thread(task);Thread t2 = new Thread(task);t1.start();t2.start();t1.join();t2.join();System.out.println(counter.getCount()); // 2000} }
特点
优点:通信效率高。
缺点:需要同步机制,容易出现 死锁、竞态条件。
2. 消息传递
原理
线程通过 传递消息 来通信,而不是直接访问共享变量。
Java中常用的方式:
wait()/notify()
方法
BlockingQueue
(推荐)
join()
方法(简单等待)Java示例(BlockingQueue[是 Java 并发包 (java.util.concurrent) 提供的一个接口,是一个支持阻塞的队列])
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue;public class ThreadMessagePassingDemo {public static void main(String[] args) {BlockingQueue<String> queue = new ArrayBlockingQueue<>(1);Thread producer = new Thread(() -> {try {queue.put("消息1");System.out.println("生产者放入消息");} catch (InterruptedException e) {e.printStackTrace();}});Thread consumer = new Thread(() -> {try {String msg = queue.take();System.out.println("消费者接收消息: " + msg);} catch (InterruptedException e) {e.printStackTrace();}});producer.start();consumer.start();} }
wait/notify 示例
class Message {private String msg;private boolean empty = true;public synchronized void put(String message) throws InterruptedException {while(!empty) wait();this.msg = message;empty = false;notifyAll();}public synchronized String take() throws InterruptedException {while(empty) wait();empty = true;notifyAll();return msg;} }
特点
优点:线程间不会直接共享数据,更安全。
缺点:效率略低,适合生产者-消费者模式。
三、总结
进程是资源分配单位,线程是执行单位。
线程间通信主要有两种:
共享内存:效率高,但需同步,易出错。
消息传递:安全性高,适合异步通信。
Java中:
共享内存:使用
synchronized
,Lock
等。消息传递:使用
BlockingQueue
,wait()/notify()
,join()
等。