java并发
java并发编程相关基础知识
longhuihu
毕业于北邮计算机系,先后供职诺基亚、网易、北京域起,从事过嵌入式,移动APP开发,2015年开始从事游戏前后端的研发及技术管理,目前专注于Netty,JVM,Redis,DDD等游戏服务端关键技术领域。
展开
-
《Java并发编程实践》五(4):java内存模型(终结篇)
到此为止,我们基本已经覆盖了java并发编程涉及的所有技术主题,包括安全发布、同步机制。这些技术之所以这样设计,都与Java内存模型(Java Memory Model, JMM)有关。我们编程时不会直接与java内存模型打交道,但是理解它对能让我们更加得心应手地使用之前学习到的各种技术。这一章,就让我们揭开java内存模型的神秘面纱。内存模型假设有一个线程执行了一句代码:aVariable = 3,内存模型要解决一个问题:在何种情况下,一个线程(包括其他线程)读取aVariable时能得到值——3。这原创 2020-05-29 16:19:10 · 473 阅读 · 0 评论 -
《Java并发编程实践》五(3):原子变量和非阻塞同步
java并发库(java.util.concurrent)提供了很多(相比锁)性能更优越的同步设施,比如ConcurrentLinkedQueue。本章的主题,是研究此类并发装置的性能秘密:原子变量和非阻塞同步。锁的性能劣势对现代JVM来说,在锁未发生竞争的情况下,JVM执行“加锁、释放锁”操作是非常快的;但是一旦发生竞争,就需要执行系统调用来挂起竞争失败的线程,等将来锁释放时再唤醒它们。挂起和唤醒线程的性能损耗是不能忽视的,对那些需要加锁的高频操作(比如集合读写)来说,锁竞争导致的线程调度消耗的CP原创 2020-05-29 16:06:05 · 295 阅读 · 0 评论 -
《Java并发编程实践》五(2):自定义同步器
这一章介绍基于状态条件同步的一般场景,以及通过条件队列来构建自定义同步机制的方法。最后介绍JDK同步器的公共抽象—AQS的基本原理,以及它在Java并发库内的应用。状态条件一般来说,线程之间的同步都是围绕状态条件展开的,以”容量有限队列“为例,take操作必须在队列满足“nonempty“状态条件下才能执行;如果不满足条件,take操作要么失败,要么阻塞。构建基于状态、具备并发同步功能的类,最容易的方式是使用现有的同步装置,下使用CountDownLatch构建一个二元的同步装置ValueLatch,用原创 2020-05-26 19:40:05 · 409 阅读 · 0 评论 -
《Java并发编程实践》五(1):显示锁
本书最后一部分:“并发高级主题“,其内容如下:第13章:显式锁ReentrantLock;第14章:构建自定义同步器;第15章:非阻塞同步器;第16章:java内存模型ReentrantLockjava 5之前,java语言唯一的线程同步手段就是 synchronized 和 volatile;Java 5增加了ReentrantLock,它不是java监视锁的替代品,而是在后者不满足需求时,提供更丰富的功能。java为锁定义了一个通用的接口Lock,提供了相关锁操作方法如下:publi原创 2020-05-26 19:26:47 · 214 阅读 · 0 评论 -
《Java并发编程实践》四(2):并发性能和可伸缩性
使用多线程的主要动机就是提升系统的性能和响应性,充分利用硬件和其他资源的处理能力。这一章介绍分析、监控和改善并统发系性能的技术。不过,多线程系统极其复杂,提升性能的技术往往会增加安全和活性风险;如果使用不当,改善性能的尝试,往往是解决一个问题的同时,引入另一个问题,得不偿失。因此,在准备对并发系统进行性能优化之前要记住两点:先保证程序正确,再优化性能,且仅在测试表明需要优化时;追求极致的性能没有什么意义;对性能的思考提升性能意味着用更少的资源做更多的事。资源有多种多样,比如CPU,内存,网络带原创 2020-05-18 10:50:15 · 397 阅读 · 0 评论 -
《Java并发编程实践》四(1):死锁
第10~12章是本书第三部分,介绍多线程模式下的性能问题:第10章:死锁,主要介绍死锁引起的线程活性失败;第11章:并发性能和可伸缩性,介绍多线程角度如何分析程序的性能;第12章:测试,如何对多线程程序进行测试,此章跳过。死锁及死锁避免(Deadlock)如果线程A持有一个锁,那么其他想要获取这个锁的线程会被阻塞;如果A永远不释放这个锁,那么其他线程永远被阻塞,这最简单的死锁场景。这种情景是比较明显的编程错误,实际项目中比较少出现。如果线程A当前拥有锁L,尝试获取锁M,但是线程B却相反,当前原创 2020-05-18 10:23:22 · 276 阅读 · 0 评论 -
《Java并发编程实践》三(8):线程池和任务队列
线程池的概念在第6、7章已经反复出现多次,因为Executor框架的实现需要线程池来执行任务;这一章详细介绍如何配置线程池。任务和执行策略前面提到,Excecutor框架将任务的提交和执行分离,实现了二者之间的解耦。但在实际项目中,任务之间可能存在关联或其他约束,并不能在任何执行策略下保证正确性。非独立任务:独立任务可适应任何执行策略,是程序具有最好的可扩展性。在执行过程中,你可以随意...原创 2020-05-08 11:38:08 · 843 阅读 · 0 评论 -
《Java并发编程实践》三(7):任务取消
通过Executor框架提交一个任务是很简单的,绝大多数情况下,我们让任务代码执行完毕;换句话说,任务自身决定如何结束。如果调用者想终止一个任务该怎么办?上一章介绍的Future.cancel方法看起来正好满足我们的需求,然而如何安全、快速、可靠地取消一个异步任务或线程,要比这句代码看起来要复杂得多,值得我们用一整章来学习。任务取消在任务正常结束前,取消一个任务可能有以下几种动机:用户要求...原创 2020-05-08 11:34:35 · 416 阅读 · 0 评论 -
《Java并发编程实践》三(6):任务及其执行
前面第2~5章是本书的第二部分,介绍了线程安全的基本知识,以及常用的java线程安全组件。这一章开始,进入第二部分,从更高的层次,介绍如何通过结构化的方式,来设计、构建基于多线程的应用系统。第6章:任务及其执行第7章:任务的取消和关闭第8章:使用线程池第9张:GUI应用(本系列文章跳过这一章)本章介绍Task的概念及其执行方式。Task大多数并发系统将工作抽象为Task,所谓ta...原创 2020-05-08 11:31:51 · 202 阅读 · 0 评论 -
《Java并发编程实践》二(5):线程安全组件
这是第二部分最后一章,介绍java提供的线程安全组件;需要注意的是,由于本书比较老,只涵盖Java 1.6的并发组件,内容并不过时,但完整性有所欠缺。第4章介绍了编写线程安全类的几种途径,其中“委托线程安全”策略基于现有的线程安全类型来构建自定义的线程安全类,是最可靠的、最常用的策略。因此本章全面地介绍一下JDK为我们提供的线程安全的组件。同步集合(Synchronized Collectio...原创 2020-05-08 11:28:38 · 228 阅读 · 0 评论 -
《Java并发编程实践》二(4):组合对象的线程安全性
前面介绍了线程安全的基础技术,在实际项目中,我们肯定不希望在那个层面来分析每一个对象操作的线程安全性,而是期望使用现有的线程安全组件来构建线程安全的程序。如何设计一个线程安全的类如果将一个类的状态存储在public static的字段内,那么保证线程安全是很难的,因为程序的任何地方都可以自由地修改状态。良好的封装限制了状态的访问路径,更容保证线程安全性。设计一个线程安全类需要考虑一下几个方面...原创 2020-04-09 19:59:39 · 194 阅读 · 0 评论 -
《Java并发编程实践》二(3):共享对象
上一章介绍了如何通过原子操作来保护对象状态,这一章介绍如何在多线程之间共享和发布对象。多个线程共享一个对象涉及两个问题,第一个问题是多线程并发地访问对象而不发生错误;第二个问题是当一个线程修改了对象状态,其他线程能够及时看到这个修改。第一个问题上一章已经给出解决思路,而第二个问题也被称为“可见性”问题。可见性对于单线程的应用来说,如果一个变量被修改,那么后续对这个变量的读操作,读到的一定是修改...原创 2020-04-04 16:00:55 · 281 阅读 · 1 评论 -
《Java并发编程实践》二(2):什么是线程安全
每当我们谈及线程安全的话题,都会想到Thread, Lock这些词语,不过这些都是线程安全相关的工具,就像建筑桥梁所用的钉子、砖头。线程安全真正关注的核心问题是“正确地管理程序状态”,更具体的,是“管理共享可变状态”。状态在谈及线程安全时,状态可简单理解为内存数据,在java世界里,状态就是指存储在状态变量里的数据;状态变量可以是对象实例的字段,也可能是类的静态字段。对象的状态包括任何影响该对...原创 2020-03-30 15:40:50 · 144 阅读 · 0 评论 -
《Java并发编程实践》一(1):为什么使用多线程
《Java Concurrency in Practice》是java并发编程领域的经典书籍,本人认为是最好的;本系列文章算是该书2006版本(虽然有一定年头,但内容一点不过时)的读书笔记。为什么要使用多线程?早年间,计算机的性能还比较弱的时候,大家使用多线程(进程)的动机主要是以下几点:充分利用资源当一个操作需要阻塞时(比如等待IO完成),可以通过线程调度让出CPU,让其他线程有来执...原创 2020-03-30 15:14:29 · 227 阅读 · 0 评论