以下内容转自http://ifeve.com/java-concurrency-thread/

在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。

随着多任务对软件开发者带来的新挑战,程序不在能假设独占所有的CPU时间、所有的内存和其他计算机资源。一个好的程序榜样是在其不再使用这些资源时对其进行释放,以使得其他程序能有机会使用这些资源。

再后来发展到多线程技术,使得在一个程序内部能拥有多个线程并行执行。一个线程的执行可以被认为是一个CPU在执行该程序。当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序。

多线程比多任务更加有挑战。多线程是在同一个程序内部并行执行,因此会对相同的内存空间进行并发读写操作。这可能是在单线程程序中从来不会遇到的问题。其中的一些错误也未必会在单CPU机器上出现,因为两个线程从来不会得到真正的并行执行。然而,更现代的计算机伴随着多核CPU的出现,也就意味着不同的线程能被不同的CPU核得到真正意义的并行执行。

如果一个线程在读一个内存时,另一个线程正向该内存进行写操作,那进行读操作的那个线程将获得什么结果呢?是写操作之前旧的值?还是写操作成功之后的新值?或是一半新一半旧的值?或者,如果是两个线程同时写同一个内存,在操作完成后将会是什么结果呢?是第一个线程写入的值?还是第二个线程写入的值?还是两个线程写入的一个混合值?因此如没有合适的预防措施,任何结果都是可能的。而且这种行为的发生甚至不能预测,所以结果也是不确定性的。

Java是最先支持多线程的开发的语言之一,Java从一开始就支持了多线程能力,因此Java开发者能常遇到上面描述的问题场景。这也是我想为Java并发技术而写这篇系列的原因。作为对自己的笔记,和对其他Java开发的追随者都可获益的。

该系列主要关注Java多线程,但有些在多线程中出现的问题会和多任务以及分布式系统中出现的存在类似,因此该系列会将多任务和分布式系统方面作为参考,所以叫法上称为“并发性”,而不是“多线程”。

最新文章

  1. php中trait(性状)与generator(生成器)
  2. filedownload
  3. 内存中OLTP(Hekaton)里的事务日志记录
  4. Yii2提示信息设置方法
  5. esp和ebp详解
  6. Hibernate 异常 —— Unable to instantiate default tuplize
  7. AP(应付帐管理)
  8. 【C++基础】关键字static 局部变量
  9. hdoj 4183 Pahom on Water
  10. 通过C#去调用C++编写的DLL
  11. Windows Azure入门教学系列 (五):使用Queue Storage
  12. python3 入门基础
  13. CSS 选择器优先级问题
  14. LINUX服务器上新增用户名
  15. 笔记:MyBatis Mapper XML文件详解 - Result Maps
  16. 漫画:一招学会TCP的三次握手和四次挥手
  17. Scala简介、安装、函数、面向对象
  18. C#实现给图片加边框的方法
  19. pandas replace 替换功能function
  20. 线性代数与Python

热门文章

  1. H.264学习笔记1——相关概念
  2. 自己编辑Nuget拓展包,并发布Nuget服务器,提供下载使用
  3. 未来IT行业的掌控者
  4. C++学习随笔
  5. 自定义对话框(jDialog)
  6. P2P实现的原理
  7. 关于动态添加的html元素绑定的事件不生效的解决办法
  8. 字符与数字的转换:sprintf和sscanf
  9. Python学习-range的用法
  10. eclipse之版本代号