并发所带来的好处

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. JS-DOM ~ 03. 子节点的操作、style.样式和属性、dom元素的创建方法及操作、14个例题、主要是利用js直接控制html属性

    带有Element和不带的区别 a)  带Element的获取的是元素节点 b)  不带可能获取文本节点和属性节点 获取所以子节点 a)   . childNodes b)   . children ...

  2. CAdvisor container monitor

    Now cadvisor is useful as a container montor tool. Not only it can monitor many container level metr ...

  3. CentOS下实用的网络管理工具

    昨天在家把在家待业的笔记本装上了CentOS 7最小版本,今天拿到公司发现没法改Wifi链接,在解决的过程中发现了一个TUI工具非常好用,在此分享给大家. 1. 安装 sudo yum install ...

  4. java模式之模板模式——抽象类

    模板设计模式(Template ) abstract class Action{ // 定义一个行为类 public static final String WORK = "work&quo ...

  5. Ajax/XHR/HTTP/jQuery Ajax

    Ajax即通过XHR API使用js发起的异步网络请求,它不会导致页面刷新,因此是现代Web App的关键技术. HTTP协议是Web开发中最重要的网络协议,HTTP协议详细规定了请求和响应报文. 请 ...

  6. [USACO 12DEC]Running Away From the Barn

    Description It's milking time at Farmer John's farm, but the cows have all run away! Farmer John nee ...

  7. 计蒜客NOIP模拟赛(3) D1T2 信息传递

    一个数据包在一个无向网络中传递.在时刻0,该数据包将依照特定的概率随机抵达网络中的某个节点.网络可以看做一张完全带权无向图,包含N个节点,若t时刻数据包在节点i,则在t+1时刻,数据包被传递到节点j的 ...

  8. jquery 中toggle的2种用法

    一.在元素的click事件中绑定两个或两个以上的函数  toggle不像bind需要在后面添加"click"来绑定click触发事件,toggle本身就是click触发的(而且只能 ...

  9. mooc-python语言语法week3-6

    week3 1.类型的概念:程序编程不允许有歧义的数据类型存在,所以对数据进行了划分,python语言类型分为,数字类型.字符串类型.元组类型.列表类型.文件类型.字典类型. i:数字类型: pyth ...

  10. 第三节基础篇—SQL的约束

    1.约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性.本节实验将在实践操作中熟悉 MySQL 中的几种约束. 约束分类: 2.删除数据库语句为DROP DATABASE ...