在过去一台电脑只有单个CPU,并且在同一时间只能执行单个程序。后来出现的"多任务"意味着电脑在可以同时执行多个程序(AKA任务或者进程)。虽然那并不是真正意义上的"同时"。多个程序之间共享仅有的一个CPU。操作系统会切换正在运行着的进程,在每次切换之前都会运行它们其中一个一小会儿。

多任务模型的产生给软件开发者带来了新的挑战。程序不再假设为可以一直占用CPU时间,也不再占有所有的内存或者任何其他的计算机资源。作为操作系统中的一个"良好公民",程序应当释放所有那些它不再使用的资源,这样其他的程序就可以使用这些被释放的资源。

后来又出现了多线程模型,这意味着你可以在同一个进程中运行多个线程。线程的执行可以看作是CPU正在执行线程所在的程序。当你在同一个进程中运行了多个线程的时候,就像在同一个程序中有多个CPU正在运行一样。

多线程可以极大地提高某些类型程序地性能。然后,多线程要比多任务复杂得多。在同一个进程中可以运行多个线程,因此这些线程可以同时读写相同内存块。这样会出现那些在单线程程序中不会出现地问题。而且其中某些问题并不会在单CPU机器中出现,因为在单CPU机器中两个线程从来就没有真正"同时"执行过。但是现在地计算机,大多是多核CPU,甚至也可能是多个CPU。这意味着不同的线程可以同时在不同的核或者CPU上同时执行。

如果一个线程在读一块内存区域的同时另一个线程在想这块内存写入数据,那么第一个线程在执行完读操作之后拿到的是什么值呢?是旧的值?还是第二个线程写入的新值呢?或者是二者混合之后的一个值?再或者,如果两个线程同时向同一个块内存区域写入数据,那么在它们的操作执行完之后,那块内存中的值是多少呢?是第一个线程写入的值?还是第二个线程写入的值?或者是两个写入值的混合值?

如果没有合适的预防措施那么上面任何一种结果都是可能的。这种行为甚至无法预测。出现的结果时时刻刻都不相同。因此一个开发人员必须要知道如果采取正确的预防措施 - 因此要学习如果控制线程对共享资源的访问,比如内存,文件,数据库等。这就是Java并发教程解决的问题之一。

Java中的多线程和并发

Java是第一个使开发人员很容易上手多线程的语言。Java在一开始就支持多线程。因此,Java开发者经常会遇到上面描述的问题。这就是我为什么写这篇关于Java并发的教程。对于而言可以作为笔记,同时也可以使Java开发同行从中获益。

本教程主要关注于Java中的多线程,但是其中有些问题在多线程中出现的问题也同样会在多任务和分布式系统中出现。这篇教程中同样也会出现多任务和分布式系统的参考。因此我用了"并发"这个词而不是"多线程"。

2015年的Java并发和以后的

自从第一批Java并发数据问世之后,关于并发架构和设计已经发生了很多的变化,即使是在Java 5中并发工具发布以后也是如此。

如今,又出现了类似Vert.x和Play/Akkay以及Qbit等异步"无共享"的平台和API。这些平台使用不同于标准Java/JEE中的线程并发模型,共享内存和锁。还出版了新的非阻塞的并发算法,而且类似LMax Disrupter这种非阻塞工具也已经加入到了我们的开发工具中。新的函数编程并行模式也随着Fork和Join框架引入到了Java 7中,以及Java 8中的集合流API。

随着新特性的不断出现,也到了我该更新这个Java并发教程了。因此,本教程又会在更新中了。我会在合适的写新的教程并发布它们。

Java并发(一)Java并发/多线程教程的更多相关文章

  1. Java并发与多线程教程(3)

    Java中的锁 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂.因为锁(以及其它更高级的线程同步机制)是由synchronized同步 ...

  2. Java并发与多线程教程(2)

    Java同步块 Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) ...

  3. Java并发与多线程教程(1)

    Java并发性与多线程介绍 在过去单CPU时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程.虽然并不是真正意义上的“同一时间点”,而是多个任务 ...

  4. 【多线程与并发】Java中的12个原子操作类

    从JDK1.5开始,Java提供了java.util.concurrent.atomic包,该包中的原子操作类提供了一种使用简单.性能高效(使用CAS操作,无需加锁).线程安全地更新一个变量的方式. ...

  5. Java线程与多线程教程

    本文由 ImportNew - liken 翻译自 Journaldev.   Java线程是执行某些任务的轻量级进程.Java通过Thread类提供多线程支持,应用可以创建并发执行的多个线程. 应用 ...

  6. Java并发编程:并发容器之CopyOnWriteArrayList(转载)

    Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...

  7. Java并发编程:并发容器之ConcurrentHashMap(转载)

    Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...

  8. java编程思想-java中的并发(一)

    一.基本的线程机制 并发编程使我们可以将程序划分为多个分离的.独立运行的任务.通过使用多线程机制,这些独立任务中的每一个都将由执行线程来驱动. 线程模型为编程带来了便利,它简化了在单一程序中同时jia ...

  9. Java系列笔记(6) - 并发(上)

    目录 1,基本概念 2,volatile 3,atom 4,ThreadLocal 5,CountDownLatch和CyclicBarrier 6,信号量 7,Condition 8,Exchang ...

  10. Java并发编程:并发容器之ConcurrentHashMap

    转载: Java并发编程:并发容器之ConcurrentHashMap JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的 ...

随机推荐

  1. PmExceptionController

    package main.java.com.zte.controller.system; import java.util.ArrayList; import java.util.List; impo ...

  2. opencv-3.0.0-beta和opencv2版本号的差别

    我的机器:64位系统 第一步: opencv官网下载opencv3.0.0-beta版本号.解压到自己的目录,我的目录是E:\,解压后在E盘出现名为opencv的目录.该目录下有两个子目录 第二步:配 ...

  3. 【laravel5.4】laravel5.4系列之生成_ide_helper.php文件

    在laravle中使用代码自动补全,比较方便开发,于是这边找到了相关的办法 在laravel配置完好的情况下,同时安装好了composer. 进入代码的根目录执行 composer require b ...

  4. jQuery DataTables的简单实现

    DataTables是一个jQuery的表格插件.这是一个高度灵活的工具,依据的基础逐步增强,这将增加先进的互动控制,支持任何HTML表格. 主要特点: 1.自动分页处理 2.即时表格数据过滤 3.数 ...

  5. WEB网络问题的排查【转】

    Browser/Server结构主要是利用了不断成熟的Web浏览器技术:结合浏览器的多种脚本语言和ActiveX技术,用通用浏览器实现原来需要复杂专用软件才能实现的强大功能,同时节约了开发成本.B/S ...

  6. $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别

    当 DOM(文档对象模型) 已经加载,并且页面(包括图像)已经完全呈现时,会发生 ready 事件.ready() 函数仅能用于当前文档,因此无需选择器.所以document选择器可以不要,那么就可以 ...

  7. 转python+selenium 使用switch_to_alert 出现的怪异常

    如果switch_to_alert不工作,最重要的问题就是,有1个以上的浏览器开启,导致alert抓取不到.并且在使用switch_to_alert的时候时间会比较长一些,需要等待一会儿才能完成acc ...

  8. DataGridView合并单元格(多行多列合并)

    一.点击在拖入的显示控件(TreeList)右上方的箭头,在Treelist任务中选择数据源,添加项目数据源,依次选择数据库.数据集,新建连接,浏览选择数据库(*.mdb),依次点击 下一步,选择“表 ...

  9. 使用Apktools反编译apk应用

    使用Apktools反编译apk应用 1.获取APK的classes.dex文件: 得到你想要的应用的apk文件,用解压软件打开apk,从apk中复制出classes.dex文件. 2.classes ...

  10. 取出分组后每组的第一条记录(不用group by)按时间排序

    --操作日志表 CREATE TABLE [dbo].[JobLog]( [JobLogId] [int] IDENTITY(1,1) NOT NULL, [FunctionId] [nvarchar ...