当前位置: 首页 > news >正文

面试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;}
}

特点

  • 优点:线程间不会直接共享数据,更安全。

  • 缺点:效率略低,适合生产者-消费者模式。


三、总结

  1. 进程是资源分配单位,线程是执行单位。

  2. 线程间通信主要有两种:

    • 共享内存:效率高,但需同步,易出错。

    • 消息传递:安全性高,适合异步通信。

  3. Java中:

    • 共享内存:使用 synchronized, Lock 等。

    • 消息传递:使用 BlockingQueue, wait()/notify(), join() 等。

http://www.dtcms.com/a/354879.html

相关文章:

  • k8s集群1.20.9
  • 虚拟相机的最佳实践参考是什么
  • k8s是什么?
  • docker和k8s的区别
  • Android 开发 - 数据共享(数据共享、内容提供者实现、动态权限申请)
  • 面试记录7 c++软件开发工程师
  • Flask测试平台开发实战-第二篇
  • 面试之HashMap
  • 面试tips--JVM(3)--类加载过程
  • 【赵渝强老师】MySQL数据库的多实例环境
  • 前端Sentry数据分析与可视化:构建智能化监控仪表板
  • 大数据毕业设计选题推荐-基于大数据的痴呆症预测数据可视化分析系统-Spark-Hadoop-Bigdata
  • 重置 Windows Server 2019 管理员账户密码
  • 基于SamOut的音频Token序列生成模型训练指南
  • 【Rust】 3. 语句与表达式笔记
  • Flask测试平台开发实战-第一篇
  • 安科瑞三相智能安全配电装置在养老院配电系统中的应用
  • Flask测试平台开发,登陆重构
  • F010 Vue+Flask豆瓣图书推荐大数据可视化平台系统源码
  • 新型Zip Slip漏洞允许攻击者在解压过程中操纵ZIP文件
  • 大模型训练推理优化(5): FlexLink —— NVLink 带宽无损提升27%
  • Android Glide插件化开发实战:模块化加载与自定义扩展
  • 使用MySQL计算斐波那契数列
  • 三轴云台之闭环反馈技术篇
  • Vue + ECharts 中 Prop 数据被修改导致图表合并的问题及解决方案
  • Vibe Coding到底是什么:什么是 Vibe Coding?AI编程?
  • SpringCloud OpenFeign 远程调用(RPC)
  • Web网络开发 -- 常见CSS属性
  • 前端RSA加密遇到Java后端解密失败的问题解决
  • 创建uniApp小程序项目vue3+ts+uniapp