首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java并发编程艺术-并发编程基础

Java从诞生开始就明智地选择了内置对多线程支持,这使得Java语言相比同一时期其他语言具有明显优势。...本章将着重介绍Java并发编程基础知识,从启动一个线程到线程间不同通信方式,最后通过简单线程池示例以及应用(简单Web服务器)来串联本章所介绍内容。...(3)更好编程模型 Java为多线程编程提供了良好、考究并且一致编程模型,使开发人员能够更加专注于问题解决,即为所遇到问题建立合适模型,而不是绞尽脑汁地考虑如何将其多线程化。...一旦开发人员建立好了模型,稍做修改总是能够方便地映射到Java提供多线程编程模型上。...线程状态 Java线程在运行生命周期中可能处于表4-1所示6种不同状态,在给定一个时刻,线程只能处于其中一个状态。 Java线程状态  ? ?

53730

Java并发编程艺术

2.volatile使用优化 著名Java并发编程大师Doug lea在JDK 7并发包里新增一个队列集合类Linked- TransferQueue,它在使用volatile变量时,用一种追加字节方式来优化队列出队和入队性...我们可以来计算下,一个对象引用占4个字节,它追加了15个变量(共占60个字节),再加上父类value变量,一共64个 字节。 为什么追加64字节能够提高并发编程效率呢?...不过这种追加字节方式在Java 7下可能不生效,因为Java 7变得更加智慧,它会淘汰或重新排列无用字段,需要使用其他追加字节方式。...2.2.1Java对象头 synchronized用锁是存在Java对象头里。如果对象是数组类型,则虚拟机用3个字宽(Word)存储对象头,如果对象是非数组类型,则用2字宽存储对象头。...对synchronize有用 Java偏向锁(Biased Locking)是Java6引入一项多线程优化。

70520
您找到你想要的搜索结果了吗?
是的
没有找到

Java并发编程艺术

昨天阅读翻译了CompletableFuture源码,目前百度,有道,基本是翻译效果一般,Google翻译比较准确,源码有很多注释,写个小测试类将其去掉,另外获得了《Java并发编程艺术》PDF...参考《Java并发编程艺术》 1.上下文切换 个人理解:CPU需要暂停当前任务,执行另一个任务,另一个任务完成后再执行当前任务,我们知道时钟中断导致cpu切换进程 原文:CPU通过时间片分配算法来循环执行任务...原文:1.1.3 如何减少上下文切换 减少上下文切换方法有无锁并发编程、CAS算法、使用最少线程和使用协程。 ·无锁并发编程。...JavaAtomic包使用CAS算法来更新数据,而不需要加锁。 ·使用最少线程。避免创建不需要线程,比如任务很少,但是创建了很多线程来处理,这 样会造成大量线程都处于等待状态。...(Thread.java:662) 第四步:减少JBOSS工作线程数,找到JBOSS线程池配置信息,将maxThreads降到100。

43620

Java并发编程艺术

锁是用来控制多个线程访问共享资源方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发访问共享资源,比如读写锁)。...参考《Java并发编程艺术》 happens-before简介 从JDK 5开始,Java使用新JSR-133内存模型(除非特别说明,本文针对都是JSR-133内存模型)。...每次处理器和内存之间数据传递都是通过一系列步骤来完成,这一系列步骤称之为总线事务(Bus Transaction)。 ? 疑问?这个总线与CPU总线是一个概念吗?宏观作用上差不多 ?...这意味着,当一个Java虚拟机中不存在非Daemon线程时候,Java虚拟机将会退出。可以通过调用Thread.setDaemon(true)将线程设置为Daemon线程。...总的来说还是看源码吧,多看,多参考资料,通过原理,源码,操作系统等资料熟悉JUC,大多数资料总结都是一样

34520

Java并发编程艺术(一)

并发编程目的是为了让程序运行更快,但是并不是启动更多线程就能让程序更大限度地并发执行。--例如上下文切换问题,死锁问题,受限于软件和硬件资源问题。...减少上下文切换方式: 1、无锁并发编程。多线程竞争锁时候,会引起上下文切换,尽可能避免使用锁可以减少上下文切换:如将数据ID按照Hash算法取模分段,不同线程处理不同段数据。...JavaAtomic包使用CAS算法来更新数据,而不需要加锁。 3、使用最少线程数量。大量空闲线程(waitting状态),除了增加创建开销,还有切换上下文开销。...(释放锁失败抛异常后仍然持有锁) 资源限制 在并发编程时,程序执行速度受限于计算机硬件资源或软件资源。...不同机器处理不同数据,可以通过“数据ID%机器数”,计算计算机编号,根据不同编号用不同机器处理。 资源限制情况下进行并发编程 根据不同资源限制调整程序并发度。

53810

Java并发编程艺术,解读并发编程优缺点

并发编程优缺点 使用并发原因 多核CPU背景下,催生了并发编程趋势,通过并发编程形式可以将多核CPU计算能力发挥到极致,性能得到提升。 在特殊业务场景下先天就适合于并发编程。...面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分。...并发编程缺点 频繁上下文切换 时间片是CPU分配给各个线程时间,因为时间非常短,所以CPU不断通过切换线程,让我们觉得多个线程是同时执行,时间片一般是几十毫秒。...通常减少上下文切换可以采用无锁并发编程,CAS算法,使用最少线程和使用协程。...,并在单线程里维持多个任务间切换 由于上下文切换也是个相对比较耗时操作,所以在《Java并发编程艺术》一书中有过一个实验,并发累加未必会比串行累加速度要快。

47030

Java并发编程艺术(七)——Executors

Executors框架简介 Executor框架便是Java 5中引入,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程启动、执行和关闭,可以简化并发编程操作...因此,在Java 5之后,通过Executor来启动线程比使用Threadstart方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键一点:有助于避免this逸出。...IDLE机制之类),所以FixedThreadPool多数针对一些很稳定很固定正规并发线程,多用于服务器; 从方法源代码看,cache池和fixed 池调用是同一个底层 池,只不过参数不同:...Executor执行任务 在Java 5之后,任务分两类:一类是实现了Runnable接口类,一类是实现了Callable接口类。...); 如果线程池中线程数量大于等于corePoolSize,且缓冲队列workQueue已满,但线程池中线程数量小于maximumPoolSize,则会创建新线程来处理被添加任务; 如果线程池中线程数量等于了

79350

Java并发编程艺术(五)——中断

Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于停止线程机制——中断。...中断只是一种协作机制,Java没有给中断增加任何语法,中断过程完全需要程序员自己实现。...中断使用 要使用中断,首先需要在可能会发生中断线程中不断监听中断状态,一旦发生中断,就执行相应中断处理代码。 当需要中断线程时,调用该线程对象interrupt函数即可。...,而第二种方法标识位是Java提供。...Java类库中提供一些可能会发生阻塞方法都会抛InterruptedException异常,如:BlockingQueue#put、BlockingQueue#take、Object#wait、Thread

1.2K70

Java并发编程艺术(三)——volatile

并发编程两个关键问题 并发是让多个线程同时执行,若线程之间是独立,那并发实现起来很简单,各自执行各自就行;但往往多条线程之间需要共享数据,此时在并发编程过程中就不可避免要考虑两个问题:通信 与 同步...由于执行次序由并发机制完成,因此不需要程序员添加额外同步机制,但需要声明消息发送和接收代码。...2.2 Java使用通信方式 Java使用共享内存方式实现多线程之间消息传递。因此,程序员需要写额外代码用于线程之间同步。...Java采用共享内存方式实现消息传递,而共享内存需要依托于同步。Java提供了synchronized、volatile关键字实现同步。此外volatile关键字还拥有一些额外功能。...你以为代码是一行行顺序执行,但实际并非如此,重排序详解请移步至:Java并发编程艺术(二)——重排序 若两行指令之间没有依赖关系,那么计算机可以对他们顺序进行重排序,但若两行之间某个变量被volatile

1K70

读书笔记《Java并发编程艺术 - 方腾飞》- Java并发编程

Java 并发编程 为什么要使用并发编程 (多线程) 科技发展, 越来越多机器拥有更多处理器核心 多线程可以带来更快响应速度 更好编程模型 什么是线程 首先我们所写 Java EE 程序在启动后...而其中每个逻辑处理, 就是由线程去完成. 线程是现代操作系统所能调度最小单元....线程优先级 在Java中, 我们可以通过 priority 属性来设置线程优先级, 参数为 1 ~ 10 参数越大, 代表优先级越高, 默认优先级为 5 而这一参数在不同虚拟机上, 在不同操作系统上都会有不同表现...线程状态 初始状态, 线程被构建, 没有调用start方法 运行状态, Java 将操作系统线程"就绪"和"运行"状态统一称为"运行中" 阻塞状态, 线程处于阻塞时 等待状态, 线程进入等待状态,...他只是用来配合, 没人需要时候即退出.

41720

并发编程艺术

很久没更新文章了,对隔三差五过来刷更新读者说声抱歉。 关于 Java 并发也算是写了好几篇文章了,本文将介绍一些比较基础内容,注意,阅读本文需要一定并发基础。...原子性 在本文中,原子性不是重点,它将作为并发编程中需要考虑一部分进行介绍。...Java 编程语言规范同样提到,鼓励 JVM 开发者能保证 64 位值操作原子性,也鼓励使用者尽量使用 volatile 或使用正确同步方式。关键词是”鼓励“。...Java 对于并发规范约束 并发问题使得我们代码有可能会产生各种各样执行结果,显然这是我们不能接受,所以 Java 编程语言规范需要规定一些基本规则,JVM 实现者会在这些规则约束下来实现 JVM...小结 之前看过 Java8 语言规范《深入分析 java 8 编程语言规范:Threads and Locks》,本文中很多知识是和它相关,不过那篇直译文章可读性差了些,希望本文能给读者带来更多收获

44040

并发编程艺术

很久没更新文章了,对隔三差五过来刷更新读者说声抱歉。 关于 Java 并发也算是写了好几篇文章了,本文将介绍一些比较基础内容,注意,阅读本文需要一定并发基础。...原子性 在本文中,原子性不是重点,它将作为并发编程中需要考虑一部分进行介绍。...Java 编程语言规范同样提到,鼓励 JVM 开发者能保证 64 位值操作原子性,也鼓励使用者尽量使用 volatile 或使用正确同步方式。关键词是”鼓励“。...Java 对于并发规范约束 并发问题使得我们代码有可能会产生各种各样执行结果,显然这是我们不能接受,所以 Java 编程语言规范需要规定一些基本规则,JVM 实现者会在这些规则约束下来实现 JVM...小结 之前看过 Java8 语言规范《深入分析 java 8 编程语言规范:Threads and Locks》,本文中很多知识是和它相关,不过那篇直译文章可读性差了些,希望本文能给读者带来更多收获

46820

并发编程艺术JAVA并发机制底层原理

系列文章: 【并发编程艺术】JVM 体系与内存模型 一 概述 在上一篇文章,概述了JVM体系结构和内存模型基础概念,我们了解到synchronized 和 volatile都属于内存模型中,处理可见性...Java代码执行过程:代码编译->Java字节码->类加载器加载到JVM->JVM执行字节码,最终转化为汇编指令在CPU中执行。所以,Java中使用并发机制,也依赖于JVM实现和CPU指令。...二 背景知识 2.1 相关CPU术语定义 下面表格来自《Java并发编程艺术》: 2.2 CPU多级缓存 关于CPU多级缓存结构,示意图如下: Intel Core i7高速缓存层次结构如下图所示...翻译过来: Java编程语言允许多线程访问共享变量。通常,为了确保共享变量得到一致和可靠地更新,线程应该通过获得一个排它锁来确保它独占使用这些变量,按照惯例,该锁强制这些共享变量互斥。...4.3.3 锁优缺点分析 通过资源消耗、线程是否阻塞、响应耗时等角度分析,偏向锁、轻量级锁、重量级锁各自优缺点如下表所示: 五 总结 本文是并发编程系列第二篇。

13710

Java并发编程艺术(十二)——线程安全

线程安全几种程度 线程安全性前提:对『线程安全性』讨论必须建立在对象内部存在共享变量这一前提,若对象在多条线程间没有共享数据,那这个对象一定是线程安全! 2.1....绝对线程安全 上述线程安全性定义即为绝对线程安全情况,即:一个对象在构造完之后,调用者无需任何额外操作,就可以在多线程环境下随意使用。...绝对线程安全是一种理想状态,若要达到这一状态,往往需要付出巨大代价。 通常并不需要达到绝对线程安全。 2.2....相对线程安全 我们通常所说『线程安全』即为『相对线程安全』,JDK中标注为线程安全类通常就是『相对线程安全』,如:Vector、HashTable、Collections.synchronizedXXX...Java中有两种实现互斥同步方式:synchronized和ReentrantLock。

77150

Java并发编程艺术(十三)——锁优化

自旋锁 背景:互斥同步对性能最大影响是阻塞,挂起和恢复线程都需要转入内核态中完成;并且通常情况下,共享数据锁定状态只持续很短一段时间,为了这很短一段时间进行上下文切换并不值得。...自适应自旋:自适应自旋可以根据以往自旋等待时间经验,计算出一个较为合理本次自旋等待时间。 锁清除 编译器会清除一些使用了同步,但同步块中没有涉及共享数据锁,从而减少多余同步。...当线程请求锁时,若该锁对象Mark Word中标志位为01(未锁定状态),则在该线程栈帧中创建一块名为『锁记录』空间,然后将锁对象Mark Word拷贝至该空间;最后通过CAS操作将锁对象Mark...前提:轻量级锁比重量级锁性能更高前提是,在轻量级锁被占用整个同步周期内,不存在其他线程竞争。...与轻量级锁区别:轻量级锁是在无竞争情况下使用CAS操作来代替互斥量使用,从而实现同步;而偏向锁是在无竞争情况下完全取消同步。

85350

Java并发编程艺术(二)——重排序

重排序指的是编译器、处理器在不改变程序执行结果前提下,重新排列指令执行顺序,以达到最佳运行效率。 重排序分类 重排序分为:编译器重排序 和 处理器重排序。...数据依赖 编译器和处理器并不会随意改变指令执行顺序,因为有些指令之间是有依赖关系,若改变了他们执行顺序,就会出现错误结果。 因此,编译器和处理器只会对没有依赖关系指令进行重排序。...数据依赖:若相邻两条指令访问同一个变量,并且其中有一条指令执行写操作,那么这样两条指令之间存在数据依赖。对于有数据依赖关系指令,不会发生重排序。...只要简单地认为指令是按照顺序依次执行即可。...这就是as-if-serial语义,即:貌似是串行

732100

Java并发编程艺术(一)——并发编程需要注意问题

并发是为了提升程序执行速度,但并不是多线程一定比单线程高效,而且并发编程容易出错。...采用无锁并发编程 我们知道,如果减少同一把锁上线程数量就能减少上下文切换次数,那么如果不用锁,是否就能避免因竞争锁而产生上下文切换呢? 答案是肯定!...但你需要根据以下两种情况挑选不同策略: 需要并发执行任务是无状态:HASH分段 所谓无状态是指并发执行任务没有共享变量,他们都独立执行。...两条线程相互等待已经被占用资源,程序就死在这了。 死锁是并发编程中一个重要问题,上面介绍减少上下文切换只是为了提升程序性能,而一旦产生死锁,程序就不能正确执行! 如何避免死锁?...问题三:计算机资源会限制并发 误区:线程越多速度越快 在并发编程中,并不是线程越多越好,有时候线程多了反而会拉低执行效率,原因如下: 线程多了会导致上下文切换增多,CPU花在上下文切换时间增多后,花在处理任务上时间自然就减少了

74250

并发编程挑战及解决方案--Java并发编程艺术

--- 写该系列旨在记录自己学习,“理解不深”,慢慢补充。 学习并发编程目的: 1.最直接回答:面试需要。 2.哈哈哈哈,以后肯定会用到。...进入正题 首先学习前了解两个概念: 并发:多个线程在同一时间间隔,一起运行状态。 并行:多个线程在同一时刻,一起运行状态。...一:并发存在目的意义: 并发编程是为了让程序运行更快,相比但单线程,使用多个线程处理一项任务,明显具有优越性。但在使用多线程时要注意,比如进程之间通信和同步问题。 多线程一定比单线程块吗?...三:如何减少上下文切换 切换上下文方法有: 无并发编程:上下文切换 是因为在多个线程在竞争锁时才会出现,给多个线程进行分配任务,让不同线程去处理不同任务,互不干扰(书中解释:将数据ID按照Hash...CAS算法 : 多线程 不使用锁,也可以使用CAS JAVA Atomic包中类来对不同数据类型保证线程安全 ,类如AtomicInterger ,AtomicString AtomicStampInterger

32500

Java并发编程艺术(四)——线程状态

线程状态 初始态:NEW 创建一个Thread对象,但还未调用start()启动线程时,线程处于初始态。 运行态:RUNNABLE 在Java中,运行态包括就绪态 和 运行态。...就绪态 该状态下线程已经获得执行所需所有资源,只要CPU分配执行权就能运行。 所有就绪态线程存放在就绪队列中。 运行态 获得CPU执行权,正在执行线程。...而在Java中,阻塞态专指请求锁失败时进入状态。 由一个阻塞队列存放所有阻塞态线程。 处于阻塞态线程会不断请求资源,一旦请求成功,就会进入就绪队列,等待执行。...也有一个等待队列存放所有等待态线程。 线程处于等待态表示它需要等待其他线程指示才能继续运行。...与等待态区别:到了超时时间后自动进入阻塞队列,开始竞争锁。 终止态 线程执行结束后状态。 线程状态转换图 ?

926110
领券