Java并发编程
jim_cainiaoxiaolang
我热爱大数据开发,希望大家多交流
展开
-
Java并发编程系列之一:并发机制的底层原理
前言并发编程的目的是让程序运行更快,但是使用并发并不定会使得程序运行更快,只有当程序的并发数量达到一定的量级的时候才能体现并发编程的优势。所以谈并发编程在高并发量的时候才有意义。虽然目前还没有开发过高并发量的程序,但是学习并发是为了更好理解一些分布式架构。那么当程序的并发量不高,比如是单线程的程序,单线程的执行效率反而比多线程更高。这又是为什么呢?熟悉操作系统的应该知道,CPU是通过给每个线程分配时转载 2017-04-10 16:42:31 · 364 阅读 · 0 评论 -
Java并发编程系列之二:重排序与顺序一致性
前言 在我们编写程序并运行的时候,编译器给我们一个错觉:程序编译的顺序与编写的顺序是一致的。但是实际上,为了提高性能,编译器和处理器常常会对指令进行重排序。重排序主要分为两类:编译器优化的重排序、指令级别并行的重排序和内存系统的重排序。所以我们编写好Java源代码之后,会经过以上三个重排序,到最终的指令序列。我们这里提到的Java内存模型又是什么呢?Java内存模型(后面简称JMM)是语言级别的转载 2017-04-15 10:43:22 · 460 阅读 · 0 评论 -
Java并发编程系列之三:锁与volatile的内存语义
前言 在前面的文章中已经提到过volatile关键字的底层实现原理:处理器的LOCK指令会使得其他处理器将缓存刷新到内存中(确切说是主存)以及会把其他处理器的缓存设置为无效。这里的内存语义则说的是在JMM中的实现,那么为什么要理解volatile和锁在JMM中的内存语义呢?主要原因是这部分内容是与程序开发息息相关的,所以在高并发量的系统中,如果对这块知识的了解欠缺的话将无法设计出优雅支持高并发的转载 2017-04-24 10:17:13 · 279 阅读 · 0 评论 -
Java并发编程系列之四:happens-before原则
前言 happens-before是JMM的核心,之所以设计happens-before,主要出于以下两个方面的因素考虑的:1)程序员的角度,JMM内存模型需要易于理解、易于编程;2)编译器和处理器的角度,编译器和处理器希望内存模型对其束缚越少越好,这样就可以根据自己的处理规则进行优化。但是这两个方面其实是相互矛盾的,因为JMM易于编程和理解就意味着对编译器和处理器的束缚就越多。 happen转载 2017-04-24 10:18:02 · 243 阅读 · 0 评论 -
Java并发编程系列之五:AQS
线程的简单回顾 在操作系统中引入多线程的原因是进程切换的开销太大,进程在进行上下文切换时由于要切换页表,往往伴随者页调度,因此开销比较大,而线程在进行上下文切换时,由于仅涉及与自身相关的寄存器状态和栈的信息(线程的上下文环境主要包含寄存器的值、程序计数器、栈指针),因此开销比较小。所以,充分利用多线程可以提供系统的执行效率以及充分利用资源。 在多个线程进行协作完成任务时,由于涉及到资源的共享与转载 2017-04-24 10:18:58 · 299 阅读 · 0 评论 -
Java并发编程系列之六:多线程的代价
线程的简单回顾 在操作系统中引入多线程的原因是进程切换的开销太大,进程在进行上下文切换时由于要切换页表,往往伴随者页调度,因此开销比较大,而线程在进行上下文切换时,由于仅涉及与自身相关的寄存器状态和栈的信息(线程的上下文环境主要包含寄存器的值、程序计数器、栈指针),因此开销比较小。所以,充分利用多线程可以提供系统的执行效率以及充分利用资源。 在多个线程进行协作完成任务时,由于涉及到资源的共享与转载 2017-04-24 10:21:28 · 255 阅读 · 0 评论 -
Java并发编程系列之七:线程状态
线程的状态一共有6种,在任意时刻线程的状态只能是其中的一种。正确理解线程的状态有助于我们更容易理解线程。具体的线程状态如下: 状态名称 说明 NEW 初始状态,线程被构建,但是还没有调用start方法 RUNNING 运行状态 BLOCKED 阻塞状态,表示线程阻塞于锁 WAITING 等待状态,表示线程线程进入等待状态,进入转载 2017-04-24 10:23:11 · 252 阅读 · 0 评论 -
Java并发编程系列之八:stop()、resume()和suspend()
这三个方法已经是jdk是过期的方法,为什么仍然要单独拿出来说呢?主要目的是理解jdk多线程API设计的初衷,理解并且更好使用线程API。那么就来说说这三个方法吧:stop方法用于终止一个线程的执行,resume方法用于恢复线程的执行,suspend方法用于暂停线程的执行。要注意的resume方法需要和suspend方法配对使用,因为被暂停的线程需要执行恢复方法才能继续执行。 虽然这三个方法不在推转载 2017-04-24 10:24:04 · 519 阅读 · 0 评论