Java并发编程:深入探索与实战案例

Java并发编程:深入探索与实战案例

在当今的多核处理器时代,并发编程已成为提升应用程序性能、优化资源利用的关键技术之一。Java,作为一门广泛应用的编程语言,凭借其强大的并发处理能力,在众多编程语言中脱颖而出。本文将深入探讨Java并发编程的核心概念、常用工具及实战案例,旨在帮助开发者更好地理解和应用Java并发技术。

一、Java并发编程基础

1. 线程与进程

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。Java通过 java.lang.Thread

类来创建和管理线程。每个线程都有自己独立的执行栈(Stack),但共享同一个堆(Heap)和方法区(Method Area)。

2. 并发与并行

并发是指在同一时间段内,多个任务都在运行,但不一定是同时运行。它们可能交替执行。而并行则是指多个任务在同一时刻同时运行,这通常需要多核处理器支持。

3. Java内存模型(JMM)

Java内存模型定义了变量如何从主内存传输到工作内存,以及如何在不同的线程之间共享变量。理解JMM对于编写正确的并发程序至关重要,它涉及原子性、可见性和有序性三大特性。

二、Java并发工具与机制

1. synchronized关键字

synchronized 是Java提供的一种简单有效的线程同步机制,它可以修饰方法或代码块。当一个线程访问某个 synchronized

修饰的代码块时,其他线程必须等待,直到该线程释放锁。

示例代码

java复制代码public class Counter {    private int count = 0;    public synchronized void increment() {    count++;    }    public synchronized int getCount() {    return count;    }    }  

2. Lock接口与ReentrantLock类

相比 synchronizedjava.util.concurrent.locks.Lock 提供了更灵活的锁机制,如尝试获取锁( `

tryLock() )、可中断的锁获取( lockInterruptibly() )以及超时获取锁( tryLock(long time,

TimeUnit unit) ` )。

示例代码

java复制代码import java.util.concurrent.locks.Lock;    import java.util.concurrent.locks.ReentrantLock;    public class CounterWithLock {    private int count = 0;    private final Lock lock = new ReentrantLock();    public void increment() {    lock.lock();    try {    count++;    } finally {    lock.unlock();    }    }    public int getCount() {    lock.lock();    try {    return count;    } finally {    lock.unlock();    }    }    }  

3. 原子变量类

java.util.concurrent.atomic 包下的类提供了可以在多线程环境中安全操作的变量,如 AtomicInteger

AtomicLong 等。它们通过底层使用Unsafe类实现的CAS(Compare And Swap)操作来保证原子性。

示例代码

java复制代码import java.util.concurrent.atomic.AtomicInteger;    public class AtomicCounter {    private final AtomicInteger count = new AtomicInteger(0);    public void increment() {    count.incrementAndGet();    }    public int getCount() {    return count.get();    }    }  

4. 并发集合

Java提供了多种线程安全的集合类,如 ConcurrentHashMapCopyOnWriteArrayList

等,它们在设计上充分考虑了并发访问的需求,提高了并发性能。

5. 线程池

java.util.concurrent.Executors 提供了多种创建线程池的方式,如 newFixedThreadPool 、 `

newCachedThreadPool ` 等。线程池可以有效管理线程的生命周期,减少线程创建和销毁的开销。

示例代码

java复制代码import java.util.concurrent.ExecutorService;    import java.util.concurrent.Executors;    public class ThreadPoolExample {    public static void main(String[] args) {    ExecutorService executor = Executors.newFixedThreadPool(4);    for (int i = 0; i < 10; i++) {    executor.execute(() -> {    System.out.println(Thread.currentThread().getName() + " is running");    });    }    executor.shutdown();    }    }  
三、实战案例:构建高性能Web服务器

假设我们要实现一个简化的Web服务器,能够处理多个并发请求。我们可以利用Java的并发工具来优化服务器的性能。

1. 设计思路

  • 使用 ServerSocket 监听端口,接受客户端连接。
  • 使用线程池处理客户端请求,避免为每个请求创建新线程带来的开销。
  • 使用 ConcurrentHashMap 存储会话信息,保证线程安全。

2. 代码实现

java复制代码import java.io.*;    import java.net.*;    import java.util.concurrent.*;    public class SimpleWebServer {    private static final int PORT = 8080;    private static final ExecutorService executor = Executors.newCachedThreadPool();    public static void main(String[] args) throws IOException {    try (ServerSocket serverSocket = new ServerSocket(PORT)) {    System.out.println("Server started on port " + PORT);    while (true) {    Socket clientSocket = serverSocket.accept();    executor.execute(new ClientHandler(clientSocket));    }    }    }    static class ClientHandler implements Runnable {    private final Socket clientSocket;    ClientHandler(Socket clientSocket) {    this.clientSocket = clientSocket;    }    @Override    public void run() {    try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {    String request = in.readLine();    System.out.println("Received request: " + request);    // 简单响应"Hello, World!"    out.println("HTTP/1.1 200 OK");    out.println("Content-Type: text/plain");    out.println("Content-Length: 13");    out.println();    out.println("Hello, World!");    } catch (IOException e) {    e.printStackTrace();    } finally {    try {    clientSocket.close();    } catch (IOException e) {    e.printStackTrace();    }    }    }    }    }  
四、总结

Java并发编程是一个复杂而强大的领域,它提供了多种工具和技术来应对多线程环境下的挑战。从基础的 synchronized 到高级的 ` Lock

Atomic `

类,再到线程池和并发集合,Java为开发者提供了丰富的选择。通过理解这些工具的工作原理,并结合实际场景进行应用,我们可以构建出高性能、可扩展的并发应用程序。本文介绍的实战案例,展示了如何将这些知识应用于构建一个简单但高效的Web服务器,希望对读者有所启发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/55650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++打怪之路Lv7】-- 模板初阶

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…

ES postman操作全量修改,局部修改,删除

全量修改 修改需要调用的url 地址是http://192.168.1.108:9200/shopping/_doc/1001&#xff0c;调用方法使用put 只修改指定的需求的内容的请求方式 post方式就是局部修改 http://192.168.1.108:9200/shopping/_update/1001&#xff0c;请求方式post 上图是只修改id 为1001数…

①EtherCAT转ModbusTCP, EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关https://item.taobao.com/item.htm?ftt&id822721028899 协议转换通信网关 EtherCAT 转 ModbusTCP GW系列型号 MS-GW15 简介 MS-GW15 是 EtherCAT 和 Modbus TCP 协议转换网关&#xff0c;为用户提供一种 …

Redis面试题——第一篇

1. Redis主从复制的实现原理是什么 Redis的主从复制是指一个Redis实例可以将数据复制到一个或者多个从节点&#xff0c;从节点从主节点获取数据并保持同步。 复制流程 连接&#xff1a;从节点通过向主节点发送PSYNC命令建立连接。全量复制&#xff1a;如果是第一次连接或者之…

基于springboot的家政服务管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的家政服务管理系统1拥有三种角色 管理员&#xff1a;用户管理、服务管理、评价管理、预约管理、分配管理等 用户&#xff1a;登录注册、预约服务、取消服务、评价等 服…

wsl2 ubuntu 桥接以太网卡

注意&#xff1a;此方法需要至少 Windows 11 22H2。桥接模式就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。 在桥接的作用下&#xff0c;类似于把宿主机虚拟为一个交换机&#xff0c;所有桥接设置的虚拟机连接到这个交换机的一个接口上&#xff0c;宿主机也同样插在这…

Prometheus之Pushgateway使用

Pushgateway属于整个架构图的这一部分 The Pushgateway is an intermediary service which allows you to push metrics from jobs which cannot be scraped. The Prometheus Pushgateway exists to allow ephemeral and batch jobs to expose their metrics to Prometheus. S…

Qt+VS2019+大恒相机相机回调方式总结

一、前言 大恒驱动安装完成后&#xff0c;在安装目录有SDK调用文档&#xff0c;里面有更详细的调用介绍&#xff0c;此文档对近期做的Demo做一个回顾性总结。 二、调用流程概述 三、针对性内容介绍&#xff1a; 1. 在执行相机操作之前&#xff0c;需要先执行此代码&#xff1…

【word脚注】双栏设置word脚注,脚注仅位于左栏,右栏不留白

【word脚注】双栏设置word脚注&#xff0c;脚注仅位于左栏&#xff0c;右栏不留白 调整前效果解决方法调整后效果参考文献 调整前效果 调整前&#xff1a;脚注位于左下角&#xff0c;但右栏与左栏内容对其&#xff0c;未填充右下角的空白区域 解决方法 备份源文件复制脚注内…

Python 3 和 MySQL(PyMySQL) 的完美结合

Python 3 和 MySQL(PyMySQL) 的完美结合 在当今的数据驱动世界中,数据库是任何应用程序的核心组成部分。MySQL 作为最流行的开源关系数据库管理系统之一,以其可靠性、易用性和高性能而受到广泛青睐。而 Python,作为一种高级编程语言,以其简洁明了的语法和强大的库支持,成…

Error while loading conda entry point: conda-libmamba-solver

问题 解决方法 conda install --solverclassic conda-forge::conda-libmamba-solver conda-forge::libmamba conda-forge::libmambapy conda-forge::libarchive

时间相关数据的统计分析(笔记更新中)

对事件相关数据的统计思路做一个笔记 可以用作肿瘤生长曲线&#xff08;Tumor Growth Curve&#xff09;/某一个药物处理后不同时间点表型的获取类型的数据。 总体来说合适的有两类&#xff0c;一类是以ANOVA为基础的方差分析&#xff0c;重复测量资料的方差分析&#xff1b;…

算法:前缀和算法模版

一维前缀和 题目 链接&#xff1a;一维前缀和模版题 思路分析 一&#xff1a;暴力O(q * N) 对于每一次询问&#xff0c;我们都可以用一个循环计算[l,r]区间内的元素和&#xff0c; 时间复杂度&#xff0c;O(q * N) 每一次计算一个区间都需要去循环一次&#xff0c;这是不是…

KiCad 综合笔记

开窗 选中顶层或者底层 Mask 层&#xff0c;然后进行覆铜&#xff1a; 四层板 KiCad Tutorial - How to make a 4 layer PCB https://bbs.elecfans.com/jishu_2365544_1_1.html 虽然在“电路板设置”中&#xff0c;可以选择铜层的类型&#xff0c;但如果选择了“电源层”&am…

深度学习中的迁移学习:预训练模型微调与实践

深度学习中的迁移学习&#xff1a;预训练模型微调与实践 目录 &#x1f4a1; 迁移学习的核心概念&#x1f9e0; 预训练模型的使用&#xff1a;ResNet与VGG的微调&#x1f3e5; 迁移学习在医学图像分析中的应用&#x1f504; 实践中的迁移学习微调过程 1. &#x1f4a1; 迁移学…

Streamlit:用Python快速构建交互式Web应用

在传统的Web开发中&#xff0c;开发者常常需要编写大量的前端和后端代码&#xff0c;才能实现一个简单的交互式Web应用。Streamlit 通过简化这一过程&#xff0c;使得你只需要用Python编写代码&#xff0c;就能快速创建具有丰富交互功能的Web应用。本文将介绍如何使用Streamlit…

Pikachu-SSRF(curl / file_get_content)

SSRF SSRF是Server-side Request Forge的缩写&#xff0c;中文翻译为服务端请求伪造。产生的原因是由于服务端提供了从其他服务器应用获取数据的功能且没有对地址和协议等做过滤和限制。常见的一个场景就是&#xff0c;通过用户输入的URL来获取图片。这个功能如果被恶意使用&am…

Ascend C 自定义算子开发:高效的算子实现

Ascend C 自定义算子开发&#xff1a;高效的算子实现 在 Ascend C 平台上&#xff0c;开发自定义算子能够充分发挥硬件的性能优势&#xff0c;帮助开发者针对不同的应用场景进行优化。本文将以 AddCustom 算子为例&#xff0c;介绍 Ascend C 中自定义算子的开发流程及关键技术…

如何制作一个企业网站,建设网站的基本步骤有哪些?

企业网站是企业的门面和名片&#xff0c;决定网民对企业的第一印象&#xff0c;因此&#xff0c;现在很多公司想做一个属于自己网站&#xff0c;但是不知道怎么做&#xff0c;更不知道从何做起&#xff0c;更别说做成了。为了能够让大家清楚如何做一个企业网站&#xff0c;现在…

Mysql数据库原理--查询收尾+索引+事务

文章目录 1.查询收尾1.1自查询1.2合并查询 2.索引事务2.1约束自动生成索引2.2create手动添加索引2.3.删除手动创建的索引2.4索引背后的数据结构2.5B树的结构特点和优点--经典面试题 3.事务--经典面试题3.1基本理解3.2事务的特性3.3隔离级别 1.查询收尾 1.1自查询 子查询就是套…