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

Java从放弃到继续放弃

并发编程

为什么需要多线程?

由于硬件的发展,CPU的核数增多,如果仍然使用单线程对CPU资源会造成浪费。同时,单线程也会出现阻塞的问题。所以,选择向多线程转变。
多线程的使用使得程序能够并行计算,提高计算速度。也能够异步执行,提供更快的响应速度。

什么是Java多线程并发不安全?

多线程并发不安全是指,由于多个线程并发执行可能导致执行过程中,多个线程抢占一个资源的时候导致的错误。
而Java多线程并发不安全的本质是由于线程本身不具有可见性、原子性、有序性
而Java对于不安全问题的解决方法是,提供了JMM(Java内存模型)来提供按需禁止缓存和编译优化的方法。
这些方法包括:

  • volatile、synchronized和final三个关键字
  • Happens-Before规则

正确利用这些JMM方法,就可以有效的解决上述的不安全问题。

减少多线程的上下文切换
常用的减少上下文切换的执行的方法有:

  • 无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些方法来避免使用锁。如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。
  • CAS算法:Java的Atomic包使用CAS算法来更新数据,而不需要加锁
  • 使用最少线程:避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。

线程池的主要作用

线程池的设计主要是为了管理线程,为了让用户不需要再关系线程的创建和销毁,只需要使用线程池中的线程即可。
同时线程池的出现也为性能的提升做出了很多贡献:

  1. 降低了资源的消耗:不会频繁的创建、销毁线程,线程池中的线程随取随用。
  2. 提高了相应速度:因为线程是已经创建好的线程,所以减少了线程创建的时间。
  3. 提高了线程的可管理性:线程是稀缺资源不能无限制的创建,使用线程池使得线程的数量是可控的。即=
  4. 提供了更强大的功能:线程池还提供了一些功能,比如定时执行、延迟执行、线程存活时间等。

线程池的实现

线程池的实现类是 ThreadPoolExecutor,它的继承性UML类图如下:

在这里插入图片描述
顶层接口Executor提供了一种思想:将任务提交和任务执行进行解耦,用户无需关心如何创建线程,如何调度线程来执行任务,用户只需提供Runnable对象,将任务的运行逻辑提交到执行器中,由Executor框架完成线程的调配和任务的执行部分。

ExecutorSevice增加了一些能力:

  1. 扩充执行任务的能力,补充可以为一个或一批异步任务生成Future的方法
  2. 提供管控线程池的方法,比如停止线程池的运行。

AbstractExecutorService将执行任务的流程串联了起来,保证下层的实现只需关注一个执行任务的方法即可。

ThreadPoolExecutor将会一方面维护自身的生命周期,另一方面同时管理线程和任务,是两者良好的结合从而执行并行任务。

to be continue2024年6月9日10:20:02

相关文章:

  • Web前端商品详情:深入解析与技巧实践
  • 「前端+鸿蒙」鸿蒙应用开发-TS接口-特殊用途
  • LabVIEW进行负载测试
  • HALCON-从入门到入门-阈值分割定位算子综合运用
  • SD文生图超详参数使用技巧和方法-看这一篇就懂了!!!
  • 水质在线监测站:提高水质应急处理能力
  • AI办公自动化:用Kimi批量在Excel文件名中加入日期
  • 33 _ 跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性?
  • 【保姆级教程】教你手把手搭建一个OPCDA/UA服务器
  • 超全AI大模型微调产品经理面试题
  • 转型AI产品经理(8):“习惯形成模型”如何应用在Chatbot产品中
  • 力扣每日一题 6/12 + 随机一题
  • Django 连接mysql数据库配置
  • 在Linux环境中通过Docker运行swift
  • 浔川python社官方警告——浔川总社部、浔川社团举报中心
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • es6
  • HTTP中的ETag在移动客户端的应用
  • maya建模与骨骼动画快速实现人工鱼
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • MySQL-事务管理(基础)
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • php ci框架整合银盛支付
  • React中的“虫洞”——Context
  • SpringCloud集成分布式事务LCN (一)
  • vue-router 实现分析
  • 测试开发系类之接口自动化测试
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 复杂数据处理
  • 来,膜拜下android roadmap,强大的执行力
  • 什么是Javascript函数节流?
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • Hibernate主键生成策略及选择
  • ​插件化DPI在商用WIFI中的价值
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • (C)一些题4
  • (C语言)二分查找 超详细
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .NET MVC第三章、三种传值方式
  • .Net Redis的秒杀Dome和异步执行
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .net 微服务 服务保护 自动重试 Polly
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • [20170705]diff比较执行结果的内容.txt
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [Android]竖直滑动选择器WheelView的实现
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [C#数据加密]——MD5、SHA、AES、RSA