Java实现100万+并发

34 篇文章 1 订阅
订阅专栏

Java实现百万级并发,需要注意的,三大核心问题,你知道吗?并发编程并不是一项孤立存在的技术,也不是脱离现实生活场景而提出的一项技术。

相反,实现百万级并发编是一项综合性的技术,同时,它与现实生活中 的场景有着紧密的联系。

搞懂并发编程有三大核心问题

  • 分工问题

  • 同步问题

  • 互斥问题

本文就对这三大核心问题进行简单的介绍

1、分工问题

关于分工,比较官方的解释是:一个比较大的任务被拆分成多个大小合适的任务,这些大小合适的任务被交给合适的线程去执行。

分工强调的是执行的性能。

类比现实案例

可以类比现实生活中的场景来理解分工,例如,如果你是一家上市公司的 CEO,那么,你的主要工作就是规划公司的战略方向和管理好公司。就如何管理好公司而言,涉及的任务就比较多了。

这里,可以将管理好公司看作一个很大的任务,这个很大的任务可以包括人员招聘与管理、 产品设计、产品开发、产品运营、产品推广、税务统计和计算等。如果将这些工作任务都交给 CEO一个人去做,那么估计 CEO 会被累趴下的。CEO一人做完公司所有日常工作如图1所示。

图1CEO 一人做完公司所有日常工作

如图1所示,公司 CEO 一个人做完公司所有日常工作是一种非常不可取的方式,这将导致公司无法正常经营,那么应该如何做呢?

有一种很好的方式是分解公司的日常工作,将人员招聘与管理工作交给人力资源部,将产 品设计工作交给设计部,将产品开发工作交给研发部,将产品运营和产品推广工作分别交给运 营部和市场部,将公司的税务统计和计算工作交给财务部。

这样,CEO 的重点工作就变成了及时了解各部门的工作情况,统筹并协调各部门的工作, 并思考如何规划公司的战略。

公司分工后的日常工作如图2所示。

图2公司分工后的日常工作

将公司的日常工作分工后,可以发现,各部门之间的工作是可以并行推进的。例如,在人力资源部进行员工的绩效考核时,设计部和研发部正在设计和开发公司的产品,与此同时,公司的运营人员正在和设计人员与研发人员沟通如何更好地完善公司的产品,而市场部正在加大力度宣传和推广公司的产品,财务部正在统计和计算公司的各种财务报表等。一切都是那么有条不紊。

所以,在现实生活中,安排合适的人去做合适的事情是非常重要的。映射到并发编程领域 也是同样的道理。 

并发编程中的分工

在并发编程中,同样需要将一个大的任务拆分成若干比较小的任务,并将这些小任务交给 不同的线程去执行,如图3所示。

 图3将一个大的任务拆分成若干比较小的任务

在并发编程中,由于多个线程可以并发执行,所以在一定程度上能够提高任务的执行效率。

在并发编程领域,还需要注意一个问题就是:将任务分给合适的线程去做。也就是说,该由主线程执行的任务不要交给子线程去做,否则,是解决不了问题的。

这就好比一家公司的 CEO 将规划公司未来的工作交给一位产品开发人员一样,不仅不能规划好公司的未来,甚至会与公司的价值观背道而驰。

在Java 中,线程池、Fork/Join 框架和 Future 接口都是实现分工的方式。在多线程设计模式中,Guarded Suspension 模式、Thread-Per-Message 模式、生产者—消费者模式、两阶段终止模式、Worker-Thread 模式和 Balking 模式都是分工问题的实现方式。

2、同步问题

在并发编程中,同步指一个线程执行完自己的任务后,以何种方式来通知其他的线程继续执行任务,也可以将其理解为线程之间的协作,同步强调的是执行的性能。

类比现实案例

可以在现实生活中找到与并发编程中的同步问题相似的案例。

例如,张三、李四和王五共同开发一个项目,张三是一名前端开发人员,他需要等待李四的开发接口任务完成再开始渲染页面,而李四又需要等待王五的服务开发工作完成再写接口。

也就是说,任务之间是存在依赖关系的,前面的任务完成后,才能执行后面的任务。

在现实生活中,这种任务的同步,更多的是靠人与人之间的交流和沟通来实现的。例如,王五的服务开发任务完成了,告诉李四,李四马上开始执行开发接口任务。等李四的接口开发完成后,再告诉张三,张三马上调用李四开发的接口将返回的数据渲染到页面上。现实生活中 的同步模型如图4所示。

图4现实生活中的同步模型

由图4可以看出,在现实生活中,张三、李四和王五的任务之间是有依赖关系的,张三渲染页面的任务依赖李四开发接口的任务完成,李四开发接口的任务依赖王五开发服务的任务完成。

并发编程中的同步

在并发编程领域,同步机制指一个线程的任务执行完成后,通知其他线程继续执行任务的方式,并发编程同步简易模型如图5所示。

 图5并发编程同步简易模型

由图5可以看出,在并发编程中,多个线程之间的任务是有依赖关系的。

线程A 需要阻塞等待线程 B 执行完任务才能开始执行任务,线程 B 需要阻塞等待线程 C 执行完任务才能开始执行任务。线程 C 执行完任务会唤醒线程 B 继续执行任务,线程 B 执行完任务会唤醒线程 A 继续执行任务。

这种线程之间的同步机制,可以使用如下的 if 伪代码来表示。

if(依赖的任务完成){  执行当前任务 }else{  继续等待依赖任务的执行 } 

上述 if 伪代码所代表的含义是:当依赖的任务完成时,执行当前任务,否则,继续等待依 赖任务的执行。

在实际场景中,往往需要及时判断出依赖的任务是否已经完成,这时就可以使用 while 循 环来代替 if 判断, while 伪代码如下。

while(依赖的任务未完成){  继续等待依赖任务的执行 }  执行当前任务

上述 while 伪代码所代表的含义是:如果依赖的任务未完成,则一直等待,直到依赖的任务完成,才执行当前任务。

在并发编程领域,同步机制有一个非常经典的模型——生产者—消费者模型。如果队列已满,则生产者线程需要等待,如果队列不满,则需要唤醒生产者线程;如果队列为空,则消费者线程需要等待,如果队列不为空,则需要唤醒消费者。

可以使用下面的伪代码来表示生产者—消费者模型。

生产者伪代码

while(队列已满){  生产者线程等待 }  唤醒生产者

消费者伪代码

while(队列为空){  消费者等待 }  唤醒消费者

在Java 中,Semaphore、Lock、synchronized.、CountDownLatch、CyclicBarrier、Exchanger 和 Phaser 等工具类或框架实现了同步机制。

3、互斥问题

在并发编程中,互斥问题一般指在同一时刻只允许一个线程访问临界区的共享资源。互斥强调的是多个线程执行任务时的正确性。

类比现实案例

互斥问题在现实中的一个典型场景就是交叉路口的多辆车汇入一个单行道,如图6所示。

图6交叉路口的多辆车汇入一个单行道

从图6可以看出,当多辆车经过交叉路口汇入同一个单行道时,由于单行道的入口只能容纳一辆车通过,所以其他的车辆需要等待前面的车辆通过单行道入口后,再依次有序通过单行道入口。这就是现实生活中的互斥场景。

并发编程中的互斥

在并发编程中,分工和同步强调的是任务的执行性能,而互斥强调的则是执行任务的正确性,也就是线程的安全问题。

如果在并发编程中,多个线程同时进入临界区访问同一个共享变量,则可能产生线程安全问题,这是由线程的原子性、可见性和有序性问题导致的。

而在并发编程中解决原子性、可见性和有序性问题的核心方案就是线程之间的互斥。

例如,可以使用JVM中提供的synchronized锁来实现多个线程之间的互斥,使用synchronized锁的伪代码如下。

修饰方法

public synchronized void methodName(){   //省略具体方法 }

 修饰代码块

public void methodName(){   synchronized(this){      //省略具体方法   }} 
public void methodName(){   synchronized(obj){      //省略具体方法     }  } 
public void methodName(){   synchronized(ClassName.class){      //省略具体方法   }  }

修饰静态方法

public synchronized static void staticMethodName(){   //省略具体方法 }

除了synchronized 锁,Java 还提供了 ThreadLocal、CAS、原子类和以CopyOnWrite 开头的并发容器类、Lock 锁及读/写锁等,它们都实现了线程的互斥机制。

JAVA上百实例源码以及开源项目源代码
09-17
 Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...
Spring Boot接口实现百万并发
果酱 の 博客
06-26 1万+
随着互联网的发展,越来越多的应用需要支持高并发。在这种情况下,如何实现并发成为了一个重要的问题。Spring Boot是一个非常流行的Java框架,它提供了很多方便的功能来支持高并发。本文将介绍如何使用Spring Boot来实现百万并发。Spring Boot是一个基于Spring框架的快速开发框架,它可以帮助开发人员快速构建Spring应用程序。Spring Boot提供了很多默认的配置,可以减少开发人员的工作量。同时,Spring Boot也提供了很多扩展功能,可以帮助开发人员更好地处理业务逻辑。
百万级访问量—高并发问题的解决历程
BBQ
04-08 8815
目录 一、单台服务器+数据库(原始) 二、增加反向代理 三、引入负载均衡器 四、扩展数据库 五、微服务 六、缓存和内容分发网络(CDN) 七、消息队列 八、总结 九、参考资料 一、单台服务器+数据库(原始) 原始架构 二、增加反向代理 反向代理 代理是一个接收和转发请求的过程。正常情况下,「正向代理」代理的对象是客户端,「反向代理」代理的对象是服务端,它完成这些功能...
Jmeter 性能 —— 模拟百万高并发压测思路!_百万级并发压测
最新发布
2301_79099473的博客
04-12 449
吞吐量(接受发送):>= 5000/S(QueryPS – 查询数据场景(一秒内 处理查询请求数量)-- TransactionPS – 多个操作/设计数据修改的请求)单位时间(s)-- 处理请求的数量并发量:5000/s(相对并发:某一个时间段)(绝对并发:同一个时间)响应时间:接口请求从开始到结束完整时间 – 150ms。生产环境面临并发量100000,服务器20台,平均到每台服务器5000/s,当并发需求=5000/s的时候,并发量要大于等于5000/s才扛得住。可以加入我们一起交流。
这3个并发编程的核心,竟然还有人不知道?
Java知音
06-25 233
点击关注公众号,实用技术文章及时了解并发编程并不是一项孤立存在的技术,也不是脱离现实生活场景而提出的一项技术。相反,并发编程是一项综合性的技术,同时,它与现实生活中 的场景有着紧密的联系。并发编程有三大核心问题:分工问题同步问题互斥问题本文就对这三大核心问题进行简单的介绍。1.分工问题关于分工,比较官方的解释是: 一个比较大的任务被拆分成多个大小合适的任务,这些大小合适的...
Java多线程并发编程实战之百万级数据计算性能优化实战
张俊杰 的博客
10-15 2499
Java多线程并发编程实战之百万级数据计算性能优化实战 出自: 出自 <腾讯课堂 700多分钟干货实战Java多线程高并发高性能实战全集> , 我学习完了之后, 我给 老师在课上说的话,以及视频的内容,还有代码敲了一遍,然后添加了一些注释,把执行结果也整理了一下, 做了个笔记 案例背景 某应用程序有100万条数据,且每条数据在计算前的业务校验逻辑平均耗时5毫秒,请运用多线程高并发变成等相关的基础知识,实现1分钟以内,完成计算100万条数据的平方和. Master-Worker设计模式
MQ百万级数据堆积如何处理
IT小辉同学
08-08 572
喜欢去帮助别人,但是,有时候的善良,会用的不恰当!!!
java实现多线程间的同步与互斥(读者写者问题)
12-25
java实现多线程并发中的读者与写者问题,能够实现多线程对临界资源的同步有序访问。 具体实现为: 给定一个队列A[1-10][1-100000]、元素编号1-10,其中每个元素包含10万个随机数。创建若干个线程,各循环100次;...
利用python如何处理百万条数据(适用java新手)
01-20
因为负责基础服务,经常需要处理一些数据,但是大多时候采用awk以及java程序即可,但是这次突然有百万级数据需要处理,通过awk无法进行匹配,然后我又采用java来处理,文件一分为8同时开启8个线程并发处理,但是依然处理很...
12306 的架构到底有多⽜逼.pdf
03-18
虽然现在⼤多数情况下都能订到票,但是放票瞬间即⽆票的场景,相信⼤家都深有体会。 尤其是春节期间,⼤家不仅使⽤ 12306,还会考虑“智⾏”和其他...何在 100 万⼈同时抢 1 万张⽕⻋票时,系统提供正常、稳定的服务。
decaton:Apache Kafka 上的高吞吐量异步任务处理
08-04
由于它已经设计、优化并用于的服务器系统,每个流每秒产生超过 100 万个 I/O 密集型任务,其内部实现记录并发处理的实现高度优化,可以产生理想的吞吐量以最少的服务器数量,最大限度地提高资源利用率。入门/教程请...
java并发处理方法
09-07
总共有6小节介绍解决方案,个人觉得是挺有用的
【百万级并发服务器架构的设计】
Java程序员廖志伟
06-05 753
为了防止这两种情况的发生,可以使用布隆过滤器来过滤掉一定不会存在的数据,或者设置数据的过期时间,使得缓存中的数据不会同时失效。因此,你可能还需要考虑使用一些其他的技术,比如缓存、数据库分区等,来优化系统的性能。: 在某些场景下,可以使用异步I/O技术,例如Java的CompletableFuture或者C++的async/await等,以提高系统的响应速度。: Java中的NIO库(如Java 7的NIO.2或Java 8的NIO.3)提供了非阻塞IO的支持,可以帮助实现并发的服务器架构。
Java实战:Spring Boot 利用 ThreadPoolTaskExecutor 批量插入百万级数据
oandy0的博客
03-09 1583
本文将详细介绍如何使用 Spring Boot 中的 ThreadPoolTaskExecutor 实现批量插入百万级数据。我们将深入探讨 Spring Boot 的线程池配置,以及如何使用 Java 中的并发编程技术提高数据插入的效率。
一文清晰阐述百万并发需要如何分析和设计
wanyuxiang000的专栏
01-17 4053
现在网上有很多说如何支持百万并发,打开一看都没讲啥,等于0,这怎么能忍?不让我学习是不可能的。那么支持百万并发(同时在线)要如何分析和设计它,今天祥子哥哥就带大家来剖析一下要如何设计? 首先要阐述几个概念和问题: linux系统打开文件描述符是有限的。文件描述符简写为FD(File Descrption),linux的有个核心思想是一切内容都用FD来描述,所以对应一个网络连接,实际上linux服务器打开的就是一个fd。 linux里面FD是分三层的,系统层面,用户层面,进程层面。这三层F...
从0到1 带你设计百万级并发应用要点
热门推荐
LoveSummer
01-26 1万+
设计一个拥有上百万用户的系统是很有挑战性的,这将是一个不断优化、持续改进的过程。在本章中,我们先创建一个单用户的系统,然后逐渐将其扩展成可以服务上百万用户的系统。读完本文,你将掌握几个能帮助你破解系统设计面试难题的技巧。
Redis 基础(一) 之 Redis 简介
每天多学一点点. 的博客
11-27 670
Redis 基础 之 Redis 简介 1 Redis 简介 Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。 Redis与其他 key - value 缓存产品有以下三个特点: 1.Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 2.Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set...
百万级并发实现?阿里资深架构师常用的四种性能优化方式
the shy
04-04 260
如果你这时是头脑一片空白,或是像之前的我一样,靠死记硬背或是之前的经历,答一下压缩代码,打包代码,事件代理,这说明你对性能优化还是缺乏一个整体,系统的掌握,对性能优化还只是处于听说过一个方法就加上去的阶段。这样也就无从去更好的优化性能。但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于运行的效率绝对是有提升的。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于系统的运行效率有什么影响呢?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。
java实现贪吃蛇客户端+服务器
04-25
可以使用Java的多线程技术来实现服务器并发处理多个客户端请求。 具体实现方式如下: 1. 设计贪吃蛇游戏的逻辑和规则,并制定与客户端、服务器交互的通信协议。 2. 使用Java的Socket类建立服务器和客户端之间的...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 5种用户密码加密方式,哪种最安全? 21576
  • JavaWeb项目技术架构总结 9332
  • 30分钟彻底弄懂 synchronized 锁升级过程 6064
  • Maven最全教程,看了必懂(一) 5112
  • 分布式定时调度:xxl-job 万字详解 4056

分类专栏

  • 架构 4篇
  • 设计模式 19篇
  • 面试经验 3篇
  • JVM 7篇
  • Java基础 34篇
  • 互联网技术 23篇
  • Linux 7篇
  • 数据库 14篇
  • Web 2篇
  • 其他 17篇
  • 杂七杂八 28篇
  • 各种理论 11篇
  • 框架 15篇
  • 互联网技术-Nginx 4篇
  • Java帝国故事会 2篇
  • 互联网技术-MQ 3篇
  • 互联网技术-分布式相关理论 11篇
  • 互联网技术-数据库 3篇
  • 互联网技术-架构 6篇
  • 互联网技术-缓存 17篇
  • 人生有时需要点打击和鸡汤 1篇
  • 互联网技术-微服务 5篇
  • 互联网技术-Docker 1篇

最新评论

  • 万字长文+思维导图帮你梳理 Java IO 流,还学不会你来打我(值得收藏)

    2401_83142784: FileInputStream有个地方写错了

  • IntelliJ IDEA快捷键大全 + 动图演示

    肖邦的无奈: 这么多动效制作, 竟然没人点赞表情包

  • 万字长文+思维导图帮你梳理 Java IO 流,还学不会你来打我(值得收藏)

    qq_54885424: 写的太好了

  • mysql主从复制之异常解决--- Slave_IO_Running: NO 之三大原因

    a1405: 帖子解决我的实际问题,没能解决你的问题?

  • 30分钟彻底弄懂 synchronized 锁升级过程

    Vzn: 无锁状态 -> 轻量级锁,应该是 获取锁吧

大家在看

  • linux路由配置参考案例一则 —— 筑梦之路 317
  • 限流
  • LlamaIndex vs LangChain vs Haystack——为你的 LLM app 选择合适的一款
  • 速卖通店铺防关联该怎么做?
  • ChatGPT Prompt技术全攻略-总结篇:Prompt工程技术的未来发展 628

最新文章

  • IntelliJ IDEA快捷键大全 + 动图演示
  • 分布式定时调度:xxl-job 万字详解
  • 同事把RabbitMQ讲透了
2023年1篇
2022年37篇
2021年24篇
2020年24篇
2019年124篇
2018年27篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司雅安百度竞价包年推广公司包头百姓网标王推广报价鹤岗建网站哪家好荆门百姓网标王推广价格汕头营销网站推荐巴中建网站公司金昌外贸网站设计张北SEO按天扣费公司中山关键词按天扣费哪家好肇庆关键词按天计费公司河源网站推广系统报价蚌埠网络营销价格朔州网络营销宝安建站推荐诸城英文网站建设推荐莱芜营销网站连云港品牌网站设计多少钱荆州网站优化软件随州seo多少钱肇庆关键词按天收费价格池州网站关键词优化推荐郑州网站推广东营网站优化排名价格北海外贸网站设计哪家好南联外贸网站设计价格怒江网站推广系统推荐安顺如何制作网站哪家好淮北阿里店铺运营公司喀什网站推广系统哪家好宿州网站建设报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化