并发所带来的好处

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并发编程(一)为什么要并发的更多相关文章

  1. Java并发编程入门与高并发面试(三):线程安全性-原子性-CAS(CAS的ABA问题)

    摘要:本文介绍线程的安全性,原子性,java.lang.Number包下的类与CAS操作,synchronized锁,和原子性操作各方法间的对比. 线程安全性 线程安全? 线程安全性? 原子性 Ato ...

  2. 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理

    在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...

  3. [并发编程 - socketserver模块实现并发、[进程查看父子进程pid、僵尸进程、孤儿进程、守护进程、互斥锁、队列、生产者消费者模型]

    [并发编程 - socketserver模块实现并发.[进程查看父子进程pid.僵尸进程.孤儿进程.守护进程.互斥锁.队列.生产者消费者模型] socketserver模块实现并发 基于tcp的套接字 ...

  4. 那些年读过的书《Java并发编程的艺术》一、并发编程的挑战和并发机制的底层实现原理

    一.并发编程的挑战 1.上下文切换 (1)上下文切换的问题 在处理器上提供了强大的并行性就使得程序的并发成为了可能.处理器通过给不同的线程分配不同的时间片以实现线程执行的自动调度和切换,实现了程序并行 ...

  5. 《Java并发编程的艺术》并发编程的挑战(一)

    并发编程的挑战 并发编程的初衷是让程序运行的更快,但是更多的使用多线程真的会让程序变快吗? 1.线程上下文切换 关于线程上下文切换 多个线程在一个处理器里并不是同时进行的,而是非常快速地在线程之间进行 ...

  6. Java并发(二)—— 并发编程的挑战 与 并发机制的底层原理

    单核处理器也可以支持多线程,因为CPU是通过时间片分配算法来循环执行任务 多线程一定比单线程快么?不一定,因为线程创建和上下文切换都需要开销. 如何减少上下文切换 无锁并发编程 CAS算法 使用最少线 ...

  7. Java并发编程的艺术(一)——并发编程需要注意的问题

    并发是为了提升程序的执行速度,但并不是多线程一定比单线程高效,而且并发编程容易出错.若要实现正确且高效的并发,就要在开发过程中时刻注意以下三个问题: 上下文切换 死锁 资源限制 接下来会逐一分析这三个 ...

  8. Java的编程逻辑--15章 并发基础

    1.run()和start()的区别 2.线程的基本属性和方法 id:一个递增的整数,每创建一个线程就加一 name 优先级:从1到10,默认为5,会映射到系统中的优先级.数字越大,要优先级越高 状态 ...

  9. Android并发编程 原子类与并发容器

    在Android开发的漫漫长途上的一点感想和记录,如果能给各位看官带来一丝启发或者帮助,那真是极好的. 前言 上一篇博文中,主要说了些线程以及锁的东西,我们大多数的并发开发需求,基本上可以用synch ...

  10. Java并发编程之美之并发编程线程基础

    什么是线程 进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程至少有一个线程,进程的多个线程共享进程的资源. java启动main函数其实就 ...

随机推荐

  1. winform判断chrome是否正在最前端运行

    /// <summary> /// 获取系统当前活动窗口 /// </summary> /// <returns></returns> [DllImpo ...

  2. [转]JSON.parse()和JSON.stringify()

    parse用于从一个字符串中解析出json对象,如 var str = '{"name":"huangxiaojian","age":&qu ...

  3. Vue2.0的动画效果

    本文只是结合一些代码和图片加强对Vue动画的理解,更多资料请戳这里 结合原生CSS实现动画 下面是一张图片,简单清晰明了是吧^-^ 下面是一段代码 <!DOCTYPE html> < ...

  4. 一、flex布局教程:语法篇

    本文转自阮一峰大师的教程,此处做记录,方面后面自己学习使用~   布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便 ...

  5. js下拉框去掉重复的

    想用jquery代码实现这样的一个功能:有一个下拉框,当选择下拉框的时候,判断选择的值有没有被选择过,如果有则提示:代码如下: $(function(){ var authTypes=new Arra ...

  6. Porting QML Applications to Qt 5

    When porting QML-related code from Qt 4.8 to Qt 5, application developers should be aware that the Q ...

  7. SQLite入门(二)读写二进制数据

    //读二进制数据的函数 BOOL OpenBinDataFile(BYTE **pBUf,UINT &len) {     if (pBUf == NULL)     {         re ...

  8. svnkit递归获取指定目录下的全部文件

    package demo.wc; import java.util.Collection; import java.util.Iterator; import org.tmatesoft.svn.co ...

  9. Process.start: how to get the output?

    1: Synchronous example static void runCommand() { Process process = new Process(); process.StartInfo ...

  10. day13 面向对象练习

    //1 public class Area_interface { public static void main(String[] args) { Rect r = new Rect(15, 12) ...