随笔分类 -  Java 高并发程序设计

内容均来源《Java 高并发程序设计》,博主的读书笔记。
摘要:4.2 Java虚拟机对锁优化所做的努力 介绍几种JDK内部的“锁”优化策略。 4.2.1 锁偏向 锁偏向是一种针对加锁操作的优化手段。它的核心思想是:如果一个线程获得了锁,那么锁就进入偏向模式。当这个线程再次请求锁时,无须再做任何同步操作。这样就节省了大量有关锁申请的操作,从而 提高了程序性能。因 阅读全文
posted @ 2018-01-23 00:14 _sanjun 阅读(146) 评论(0) 推荐(0)
摘要:4.1 有助于提高“锁”性能的几点建议 “锁”的竞争必然会导致程序的整体性能下降。 4.1.1 减小锁持有时间 在锁竞争过程中,单个线程对锁的持有时间与系统性能有着直接的关系。 程序开发也是类似的,应该尽可能地减少对某个锁的占有时间,以减少线程间互斥的可能。以下面的代码段为例: syncMethod 阅读全文
posted @ 2018-01-22 22:11 _sanjun 阅读(163) 评论(0) 推荐(0)
摘要:3.3 不要重复发明轮子:JDK的并发容器 3.3.1 超好用的工具类:并发集合简介 JDK提供的这些容器大部分在java.util.concurrent包中。 ConcurrentHashMap:这是一个高效的并发HashMap。可以理解为一个线程安全的HashMap。 CopyOnWriteAr 阅读全文
posted @ 2018-01-22 17:40 _sanjun 阅读(159) 评论(0) 推荐(0)
摘要:3.2.5 自定义线程创建:ThreadFactory 线程池的主要作用是为了线程复用,也就是避免了线程的频繁创建。 ThreadFactory是一个接口,它只有一个方法,用来创建线程: 当线程池需要新建线程时,就会调用这个方法。 下面的案例使用自定义的ThreadFactory,一方面记录了线程的 阅读全文
posted @ 2018-01-21 00:10 _sanjun 阅读(117) 评论(0) 推荐(0)
摘要:3.2 线程复用:线程池 一种最为简单的线程创建和回收的方法类似如下代码: 在run方法结束后,自动回收。 在真实的生产环境中,系统由于真实环境的需要,可能会开启很多线程来支撑其应用。而当线程数量过大时,反而会耗尽CPU和内存资源。 3.2.1 什么是线程池 为了避免系统频繁地创建和销毁线程,我们可 阅读全文
posted @ 2018-01-20 20:55 _sanjun 阅读(133) 评论(0) 推荐(0)
摘要:3.1.2 重入锁的好搭档:Condition条件 它和wait()和notify()方法的作用是大致相同的。但是wait()和notify()方法是和synchronized关键字合作使用的,而Condition是与重入锁相关联的。通过Lock接口的Condition newCondition() 阅读全文
posted @ 2018-01-20 14:11 _sanjun 阅读(107) 评论(0) 推荐(0)
摘要:3.1 多线程的团队协作:同步控制 3.1.1 synchronized的功能扩展:重入锁 重入锁可以完全替代synchronized关键字。 重入锁使用java.util.concurrent.locks.ReentrantLock类来实现。下面是一段最简单的重入锁使用案例: public cla 阅读全文
posted @ 2018-01-20 10:04 _sanjun 阅读(132) 评论(0) 推荐(0)
摘要:2.8 程序中的幽灵:隐蔽的错误 2.8.1 无提示的错误案例 以求两个整数的平均值为例。请看下面代码: 输出如下: 这是一个典型的溢出问题!显然,v1 + v2的结果已经导致了int的溢出。 2.8.2 并发下的ArrayList ArrayList是一个线程不安全的容器。如果在多线程中使用Arr 阅读全文
posted @ 2018-01-19 23:33 _sanjun 阅读(142) 评论(0) 推荐(0)
摘要:2.3 volatile 与 Java 内存模型(JMM) volatile对于保证操作的原子性是由非常大的帮助的(可见性)。但是需要注意的是,volatile并不能代替锁,它也无法保证一些复合操作的原子性。比如下面的例子,通过volatile是无法保证i++的原子性操 作的: 在对count累加前 阅读全文
posted @ 2018-01-19 21:59 _sanjun 阅读(248) 评论(0) 推荐(0)
摘要:2.1 有关线程你必须知道的事 进程是系统进行资源分配和调度的基本单位,是程序的基本执行实体。 线程就是轻量级进程,是程序执行的最小单位。 线程的生命周期,如图2.3所示。 线程的所有状态都在Thread中的State枚举中定义,如下所示: NEW状态表示刚刚创建的线程,这种线程还没有开始执行。等到 阅读全文
posted @ 2018-01-19 16:37 _sanjun 阅读(182) 评论(0) 推荐(0)
摘要:1.1 概念 1.1.1 同步(Synchronous)和异步(Asynchronous) 同步和异步通常用来形容一次调用。 同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。 异步调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常 阅读全文
posted @ 2018-01-19 12:46 _sanjun 阅读(228) 评论(0) 推荐(0)