Java并发编程(一)为什么要并发
并发所带来的好处
1. 并发在某些情况(并不是所有情况)下可以带来性能上的提升
1) 提升对CPU的使用效率
提升多核CPU的利用率:一般来说一台主机上的会有多个CPU核心,我们可以创建多个线程,理论上讲操作系统可以将多个线程分配给不同的CPU去执行,每个CPU执行一个线程,这样就提高了CPU的使用效率。
提升访问I/O时CPU的利用率:当一个线程要在网上下载一些东西的时候,这个线程将处于阻塞状态,这时CPU就不会再为这个线程分配CPU时间了,而其他进程可以不受任何影响地获得CPU时间。反过来如果没有使用并发,当前面的指令申请I/O资源的时候,整个进程就被挂起了,即使CPU处于空闲状态后面的指令也不能被执行。
2) 降低系统的响应时间
设想一个服务器同时有一万个用户访问,如果使用单线程,所有用户的请求就会进入到一个队列中排队,如果我恰巧是第9999个(从0开始数的)用户,那么我要等到前面9999个用户的请求都处理完成的时候服务器才会给我响应,我的用户体验将会非常的差。如果使用多线程处理就可以回避响应时间过长的问题,用户可以轮流使用CPU资源,用户可能没有始终占用系统,但是不论用户访问服务器的顺序如何,每个用户都可以很快得到用户的响应。
3)提升系统的容错能力
一个线程可以不受其他线程的干扰独立运行,如果某个线程的代码里出现了Bug,这个线程可能抛出异常退出了,这时候其他线程可以不受任何影响继续执行。
2. 方便编写代码——仿真
英雄联盟这个游戏应该很多人都听说过,这是一款在商业上很成功的5V5对战游戏,这个游戏里面有一个很“经典”的游戏模式:人机对战。5个电脑控制的英雄就是用至少(这个至少只是为了严谨而已)5个线程实现的。5个英雄仿佛都有自己的想法,以下就是它大致的策略伪代码:
每个线程各自执行自己的策略,他们之间也可以通过线程之间交互实现各个英雄之间的技能配合。如果使用单线程实现5个英雄的策略则异常的艰难。
并发的弊端
编写并发代码容易出错,多线程并发运行给执行过程带来了很多不确定性,因为只有同一个线程内部代码的执行顺序是固定的,而不同线程之间的代码执行顺序无法确定。当多个线程之间互相干扰时,问题就会接踵而至。编写多线程代码时,如果没有考虑全面很容易产生概率性的、难以复现的Bug。
系统进行线程上下文切换时会消耗少量的系统资源,例如在边写作业边玩手机的时候,在拿起笔和拿起手机的操作需要占用时间,回想刚才做题的时候的思路也有占用时间,如果先写完作业再专心玩手机可能会取得更好的效果。
总结
并发并不是完美的,是否使用并发也要结合实际情况权衡利弊。随着CPU核心和系统的用户数量的增长,多线程的应用越来越广泛。在绝大多数情况下多线程所带来的弊端在其优点面前都显得微不足道。公众号:今日说码。关注我的公众号,可查看连载文章。遇到不理解的问题,直接在公众号留言即可。
Java并发编程(一)为什么要并发的更多相关文章
- Java并发编程入门与高并发面试(三):线程安全性-原子性-CAS(CAS的ABA问题)
摘要:本文介绍线程的安全性,原子性,java.lang.Number包下的类与CAS操作,synchronized锁,和原子性操作各方法间的对比. 线程安全性 线程安全? 线程安全性? 原子性 Ato ...
- 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理
在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...
- [并发编程 - socketserver模块实现并发、[进程查看父子进程pid、僵尸进程、孤儿进程、守护进程、互斥锁、队列、生产者消费者模型]
[并发编程 - socketserver模块实现并发.[进程查看父子进程pid.僵尸进程.孤儿进程.守护进程.互斥锁.队列.生产者消费者模型] socketserver模块实现并发 基于tcp的套接字 ...
- 那些年读过的书《Java并发编程的艺术》一、并发编程的挑战和并发机制的底层实现原理
一.并发编程的挑战 1.上下文切换 (1)上下文切换的问题 在处理器上提供了强大的并行性就使得程序的并发成为了可能.处理器通过给不同的线程分配不同的时间片以实现线程执行的自动调度和切换,实现了程序并行 ...
- 《Java并发编程的艺术》并发编程的挑战(一)
并发编程的挑战 并发编程的初衷是让程序运行的更快,但是更多的使用多线程真的会让程序变快吗? 1.线程上下文切换 关于线程上下文切换 多个线程在一个处理器里并不是同时进行的,而是非常快速地在线程之间进行 ...
- Java并发(二)—— 并发编程的挑战 与 并发机制的底层原理
单核处理器也可以支持多线程,因为CPU是通过时间片分配算法来循环执行任务 多线程一定比单线程快么?不一定,因为线程创建和上下文切换都需要开销. 如何减少上下文切换 无锁并发编程 CAS算法 使用最少线 ...
- Java并发编程的艺术(一)——并发编程需要注意的问题
并发是为了提升程序的执行速度,但并不是多线程一定比单线程高效,而且并发编程容易出错.若要实现正确且高效的并发,就要在开发过程中时刻注意以下三个问题: 上下文切换 死锁 资源限制 接下来会逐一分析这三个 ...
- Java的编程逻辑--15章 并发基础
1.run()和start()的区别 2.线程的基本属性和方法 id:一个递增的整数,每创建一个线程就加一 name 优先级:从1到10,默认为5,会映射到系统中的优先级.数字越大,要优先级越高 状态 ...
- Android并发编程 原子类与并发容器
在Android开发的漫漫长途上的一点感想和记录,如果能给各位看官带来一丝启发或者帮助,那真是极好的. 前言 上一篇博文中,主要说了些线程以及锁的东西,我们大多数的并发开发需求,基本上可以用synch ...
- Java并发编程之美之并发编程线程基础
什么是线程 进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程至少有一个线程,进程的多个线程共享进程的资源. java启动main函数其实就 ...
随机推荐
- C# 索引器的使用
索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的. 索引器和数组比较: (1)索引器的索引值(Index)类型不受限制 (2)索引器允许重载 ...
- OpenCV 小图重叠至大图指定位置
Android OpenCV Java: Codes: smallImg.copyTo( bigImg.submat( y, smallImg.rows(), x, smallImg.cols() ) ...
- Android 友盟统计的集成与使用(包含多渠道打包配置)
前言 app上线后,一般公司都希望跟踪app在市场上的使用情况.包括新增用户.活跃用户.渠道信息.错误信息等,还有例如商城类的app,需要跟踪用户最喜欢浏览哪种类型的店铺或商品.这些都可以通过集成友盟 ...
- Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(人人网)(下)
Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(下) 自动使用cookie的方法,告别手动拷贝cookie http模块包含一些关于cookie的模块,通过他们我们可以自动的使用co ...
- 【Python】卸载完Python3 之后 Python2 无法打开IDLE
安装官方的Python带Idle但是却无法打开,百度谷歌了几种解决方法,加上自己的实际境况予以解决. 我的python是直接安装在C盘下的. 1.首先是设置环境变量: Path=C:\Python27 ...
- ES6入门——正则的扩展
1.RegExp构造函数 在ES5中,RegExp构造函数的参数有两种情况.第一种情况是参数是字符串,这时第二个参数表示正则表达式的修饰符:第二种情况是,参数是一个正则表示式,这时会返回一个原有正则表 ...
- 初学scrum及首次团队开发
一.初学scrum 1.什么是scrum Scrum在英语的意思是橄榄球里的争球.而在这里Scrum是一种迭代式增量软件开发过程,经常性的被用于敏捷软件开发.Scrum包括了一系列实践和预定义角色的过 ...
- mongodb学习总结
安装mongodb: 1.下载服务器最新稳定版本(选择偶数号的版本号),mongodb的版本管理偶数号为稳定版,奇数号为开发版. 2.安装时默认安装在c盘,可以选择自定义选项来改变安装路径. 3.安装 ...
- 旋转数组的最小数字(C++ 和 Python 实现)
(说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的 ...
- WebLogic如何设置session超时时间
1.web.xml 设置WEB应用程序描述符web.xml里的<session-timeout>元素.这个值以分钟为单位,并覆盖weblogic.xml中的TimeoutSecs属性 ...