简史

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

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. 6,synchronized, lock 区别

    参考文档 http://zzhonghe.iteye.com/blog/826162 http://houlinyan.iteye.com/blog/1112535 1,ReentrantLock 拥 ...

  2. WebStorm 2017 激活方法

    https://www.cnblogs.com/woaic/p/6024975.html 注册时,在打开的License Activation窗口中选择“License server”,在输入框输入下 ...

  3. iOS 开发中类似上下滚动弹幕实现原理

    #mark ---滚动弹幕 列表中留有7条记录  大于7条时删除并指引表视图向上滑动 - (void)addRowActionWithContent:(NSString *)str { if (sel ...

  4. CF765F Souvenirs 离线+线段树+主席树

    $ \color{#0066ff}{ 题目描述 }$ A县旁,连绵着一条长度为 n 的山脉,这条山脉由 n 座山峰组成,第 i 座山 峰的高度为 ai.作为著名的旅游县城,每天来到山脉游玩的旅客络绎不 ...

  5. ionic 学习 一

    ionic 依赖angular.在学之前,我对angular进行了一下入门. 最近在看ionic,想做一些笔记,所以,写下这个随笔,有什么不对的请多多指教,刚开始学,后面还会学Apache Cordo ...

  6. java web 工程创建及servlet简单使用

    1.java web工程创建 (1)File--->new--->project (2)选择java enterprise,按照下图操作 (3)点击next后,会进入如下界面,修改工程名后 ...

  7. 接口自动化之unittest+ddt

    我在上一篇(https://www.cnblogs.com/wlyhy/p/10083318.html) 文章整理了unittest的模板,但在后续学习中,发现还有许多值得优化的地方.例如在我们设计测 ...

  8. scikit-learn中predict_proba用法 (与predict的区别)

    predict_proba返回的是一个 n 行 k 列的数组, 第 i 行 第 j 列上的数值是模型预测 第 i 个预测样本为某个标签的概率,并且每一行的概率和为1. # conding :utf-8 ...

  9. netsh命令操作防火墙

    这里的netsh命令操作防火墙主要是在Windows 7及以上版本,以示例说明: 1.防火墙入方向添加一条规则,规则名字:RDP,协议tcp,动作为允许,端口号3389:简而言之,就是允许其他机器远程 ...

  10. ubuntu 16.04 屏幕截图

    shift+prtsc   快捷键截取指定区域的图片 类似qq截图