简史

  早期的计算机中不包含操作系统,从头至尾都只执行一个程序,并且这个程序能访问计算机所有资源。随着计算机发展,操作系统的出现,使得计算机可以同时运行多个程序,并且每程序都在单独的进程内运行。为什么要这么做呢?主要基于以下原因:

1.资源利用率 程序在等待时计算机可以执行另一个程序,同一个资源可以被不同程序使用,这无疑提高了资源的利用率。
2.公平性 不同的用户与程序对计算机有相同的使用权,通过时间分片每个程序共享资源,而不是等待上一个程序运行结束再启动下一个程序。
3.便利性 每个程序单独运行,必要时相互通信,比一个程序完成所有任务更容易实现。

  既然计算机由单任务发展为多任务,那程序自然也可以从传统的串行程序发展为并发程序

  串行程序的优势在于简单直观。但同样由于以上三个原因促使线程的出现。上述计算机可以在单独的进程内运行程序,而线程允许在同一个进程内存在多个程序控制流,一个程序的多个线程还可以同时被多个CPU调度运行。这就等同于计算机同时执行多个程序(进程),程序同时执行多个线程。即进程内运行线程。

  线程又称轻量级进程。现如今的操作系统都是以线程为基本单位调度的。由于线程间共享资源,如果没有明确的同步机制,便会导致线程间执行紊乱,数据错误或失效,导致异常。这通常也是并发编程的难度所在。

  以我的观点,所谓的并发编程就是对线程的运用。线程能将很多异步工作流转换成串行工作流,而并发编程便是在异步情况下实现同步,使其符合需求。

  那么线程有哪些优势和风险呢?

线程优势

  线程能有效的降低程序开发和维护成本,提升性能。降低代码复杂度,更好模拟人类工作方法。

优势1.发挥多处理器的强大功能 多处理器系统日益完善,使得线程的作用尤为明显。由于不同线程可以同时被多个处理器调度,特别是在I/O操作时,减少了程序的等待时间,多处理器让程序执行的效率提升从而导致扩大了系统的吞吐率。
优势2.降低建模难度 一直做同一件事总比做多件事来的简单。利用线程吧程序任务细化,多任务分给多线程,每个线程任务单一,必要时相互通信,比单线程来回切换任务花销更小。
优势3.简化异步事件处理 当一个请求发出等待响应时,整个程序都要等待吗?这就意味着其他请求都将停顿。就好比聊天时必须对方回复才能说下一句话,这显然是不合理的。如果给每个请求一个线程处理,线程独立不相互影响,解决了问题。当然如果聊天回复时必须知道对方说的话,注意线程安全。
优势4.响应更敏捷的用户界面传统GUI程序是单线程的,如果其中一个用户事件处理时间过长,整个程序将处于卡死状态,使得用户体验变差。如果把一些耗时操作分给一个独立线程,其他事件依旧有线程处理,变会使得用户界面流畅。

线程风险

  线程的支持是把双刃剑,并发程序的开发也给程序员们带来了更高的水平要求。

风险1.安全性问题 并发编程可能会出现单线程程序不会出现的错误。
风险2.活跃性问题 活跃性的定义是“某件正确的事情一定会发生”。单线程中无限循环便是活跃性问题。如果线程A等待线程B释放所持有的资源,线程B一直没有释放,则线程A将一直等待下去,这便是活跃性问题。
风险3.性能问题 性能则是“正确的事情尽快发生”。良好的并发设计会提升性能,反之则会降低性能,毕竟启动线程也是要消耗资源的。

  关于安全性有一个很好的例子:

value++;

  只此一行代码,在单线程程序下完全没有问题,但在多线程下可能会出现意想不到的后果。

  执行此行代码分三步:1.读取value值;2.value值加1;3.将加1的值赋回value。而程序中可能由多个线程交替执行,在此期间如果两个线程同时读出value,从而得到相同的值,又同时把它加1,结果就是不同线程获得同样的值。而我们的期望是这个值被加了两次。

  每一个java程序都会使用线程,即时你在程序中没有显示地创建线程,使用的框架仍在创建线程,这些线程必须是线程安全的。

《Java并发编程实战》读书笔记(一)----- 简介的更多相关文章

  1. Java并发编程实战 读书笔记(一)

    最近在看多线程经典书籍Java并发变成实战,很多概念有疑惑,虽然工作中很少用到多线程,但觉得还是自己太弱了.加油.记一些随笔.下面简单介绍一下线程. 一  线程与进程   进程与线程的解释   个人觉 ...

  2. Java并发编程实战 读书笔记(二)

    关于发布和逸出 并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了.这是危及到线程安全的,因为其他线程有可能通过这个 ...

  3. 《java并发编程实战》笔记

    <java并发编程实战>这本书配合并发编程网中的并发系列文章一起看,效果会好很多. 并发系列的文章链接为:  Java并发性和多线程介绍目录 建议: <java并发编程实战>第 ...

  4. Java多线程编程实战读书笔记(一)

    多线程的基础概念本人在学习多线程的时候发现一本书——java多线程编程实战指南.整理了一下书中的概念制作成了思维导图的形式.按照书中的章节整理,并添加一些个人的理解.

  5. Java并发编程实践读书笔记(5) 线程池的使用

    Executor与Task的耦合性 1,除非线程池很非常大,否则一个Task不要依赖同一个线程服务中的另外一个Task,因为这样容易造成死锁: 2,线程的执行是并行的,所以在设计Task的时候要考虑到 ...

  6. Java并发编程艺术读书笔记

    1.多线程在CPU切换过程中,由于需要保存线程之前状态和加载新线程状态,成为上下文切换,上下文切换会造成消耗系统内存.所以,可合理控制线程数量. 如何控制: (1)使用ps -ef|grep appn ...

  7. Java并发编程实践(读书笔记) 任务执行(未完)

    任务的定义 大多数并发程序都是围绕任务进行管理的.任务就是抽象和离散的工作单元.   任务的执行策略 1.顺序的执行任务 这种策略的特点是一般只有按顺序处理到来的任务.一次只能处理一个任务,后来其它任 ...

  8. Java并发编程实践读书笔记(2)多线程基础组件

    同步容器 同步容器是指那些对所有的操作都进行加锁(synchronize)的容器.比如Vector.HashTable和Collections.synchronizedXXX返回系列对象: 可以看到, ...

  9. Java并发编程实践读书笔记(1)线程安全性和对象的共享

    2.线程的安全性 2.1什么是线程安全 在多个线程访问的时候,程序还能"正确",那就是线程安全的. 无状态(可以理解为没有字段的类)的对象一定是线程安全的. 2.2 原子性 典型的 ...

  10. 《Java并发编程实战》笔记-非阻塞算法

    如果在某种算法中,一个线程的失败或挂起不会导致其他线程也失败和挂起,那么这种算法就被称为非阻塞算法.如果在算法的每个步骤中都存在某个线程能够执行下去,那么这种算法也被称为无锁(Lock-Free)算法 ...

随机推荐

  1. 如何实现 Python 中 selnium 模块的换行

    如何实现 Python 中 selnium 模块的换行 三种方法: 直接调用 .submit() 方法,常使用在用户密码登录中 # driver.find_element_by_xpath('//*[ ...

  2. 网络CCNA基础了解

    关于网络 CCNA.CCNP.CCIE 中的 CCNA 一.逻辑与.或.非 AND --> "与"计算 1 AND 1 = 1(取严) 1 AND 0 = 0 0 AND 1 ...

  3. UIControl笔记

    UIControl继承自UIView UIControl与Target-Action模式 使用addTarget:action:forControlEvents方法来设置某一个controlEvent ...

  4. Python+selenium 模拟wap端页面操作

    from selenium.webdriver.chrome.options import OptionsmobileEmulation = {'deviceName': 'iPhone X'}opt ...

  5. Codeforces - 24D 有后效性的DP处理

    题意:在n*m的网格中,某个物体初始置于点(x,y),每一步行动都会等概率地停留在原地/往左/往右/往下走,求走到最后一行的的步数的数学期望,其中n,m<1000 lyd告诉我们这种题目要倒推处 ...

  6. centos7安装串口终端kermit

    1. 将usb转串口连接到PC上.通过dmesg命令可以查看USB转串口是否被PC识别.显示 ……attachec to ttyUSB0即被识别. 2. 安装kermit.     [seif@cen ...

  7. Timer分析

    学而时习之,不亦说乎!                              --<论语> Java的JDK中自带的任务调度实现.简单易用,源码也很清晰,总共由四个类组成,都在Time ...

  8. 论文阅读 | ExtremeNet:Bottom-up Object Detection by Grouping Extreme and Center Points

    相关链接 论文地址:https://arxiv.org/abs/1901.08043 论文代码:https://github.com/xingyizhou/ExtremeNet 概述 ExtremeN ...

  9. C语言字符串的操作

    C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. 字符串转化为整数 - atoi4. 字符串求长 - strlen5. 字符串连接 - strcat6. ...

  10. 爬虫--requeste

    1.requeste模块,是我们Python对我们爬虫有好的一面,,其主要作用是用来模拟浏览器发起请求.功能强大,用法简洁高效.在爬虫领域中占据着半壁江山的地位.没有的话直接pip3 install  ...