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

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

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

56130

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引入一项多线程优化。

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

    Java并发编程艺术

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

    35920

    Java并发编程艺术

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

    46620

    Java并发编程艺术(一)

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

    57310

    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,则会创建新线程来处理被添加任务; 如果线程池中线程数量等于了

    82150

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

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

    50130

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

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

    1.2K70

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

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

    43820

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

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

    1K70

    并发编程艺术

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

    49420

    并发编程艺术

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

    45640

    并发编程艺术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 锁优缺点分析 通过资源消耗、线程是否阻塞、响应耗时等角度分析,偏向锁、轻量级锁、重量级锁各自优缺点如下表所示: 五 总结 本文是并发编程系列第二篇。

    20410

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

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

    80850

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

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

    89150

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

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

    77150

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

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

    762100

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

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

    34000

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

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

    950110
    领券