《Java并发编程的艺术》
文章平均质量分 68
maohoo
北漂中的一名java worker,寻觅自己的一片雾霾
展开
-
读书笔记《JAVA并发编程的艺术》 第三章 Java内存模型 3.1 内存基础
读书笔记《JAVA并发编程的艺术》 第三章 Java内存模型 3.1 内存基础 3.1.1 - 3.1.2 Java并发基础与内存模型 在并发编程里,需要处理两个问题:线程之间如何通信及线程之间如何同步。通信指的是线程之间以何种机制来交换信息。在命令式编程里中,线程之间的通信机制有两种:共享内存和消息传递。 Java的并发采用的是共享内存模型。 Java线程之间的通信由Java内存模型...原创 2018-07-24 13:22:45 · 436 阅读 · 0 评论 -
读书笔记《JAVA并发编程的艺术》 第五章 Java中的锁 5.2 队列同步器 5.2.2
5.2.2 队列同步器的实现分析 1: 同步队列(一个FIFO的双向队列) (1)设置头节点:是通过获取同步状态成功的线程来完成的,所以不需要使用CAS来保证线程安全。 (2)设置尾节点:加入队列需要保证现场安全,所以同步器提供了一个基于CAS的设置尾节点的方法:compareAndSetTail() 2: 独占式同步状态获取与释放 在获取同步状态时,同步器维护了一个同步队列,获取状...原创 2018-08-03 13:09:45 · 256 阅读 · 0 评论 -
读书笔记《JAVA并发编程的艺术》 第五章 Java中的锁 5.5 LockSupport工具 5.6 Condition接口
5.5 LockSupport工具 作用:阻塞或者唤醒一个线程。 package java.util.concurrent.locks; 方法名称 描述 void park() 阻塞当前线程,调用unpark()或者被中断,才能从park()中返回 void parkNanos(long nanos) 阻塞当前线程,最长不超过nanos纳秒 ...原创 2018-08-07 11:09:08 · 244 阅读 · 1 评论 -
读书笔记《JAVA并发编程的艺术》 第五章 Java中的锁 5.2 队列同步器 5.2.1
5.2 队列同步器 同步器(AbstractQueuedSynchronizer)是实现锁或者说任意同步组件的关键,在锁的实现中聚合同步器,利用同步器实现锁的语义。 同步器和锁的关系:锁是面向使用者的,它定义了使用者与锁交互的接口(比如可以允许两个线程并行访问),隐藏了实现细节;同步器面向的是锁的实现者,它简化了锁的实现方式,屏蔽了同步状态管理、线程的排队、等待与唤醒等底层操作。 5.2.1...原创 2018-08-02 15:18:22 · 214 阅读 · 0 评论 -
读书笔记《JAVA并发编程的艺术》 第五章 Java中的锁 5.1 Lock接口
5.1 Lock接口 1:Lock接口出现之前,Java主要靠synchronized关键字实现锁功能。它提供了显式地获取和释放锁的便捷性,但是也缺少了synchronized的隐式获取和释放锁的便捷性,程序员可以在不同场景进行选择。 Lock的使用也很简单,示例代码如下: Lock lock = new ReentrantLock(); lock.lock(); try { }finall...原创 2018-08-02 14:10:39 · 239 阅读 · 0 评论 -
读书笔记《JAVA并发编程的艺术》 第五章 Java中的锁 5.3 重入锁 5.4 读写锁
5.3 重入锁 重入锁(ReentrantLock)就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。 5.3.1 实现重进入 线程再次获取锁:锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取。 锁的最终释放:线程重复N次获取锁,随后需要第N次释放锁后,才算释放,这期间需要维护一个计数器。 5.3.2 公平与非公平获取锁的区别 公平锁保证了锁的获取...原创 2018-08-06 13:59:55 · 211 阅读 · 0 评论 -
读书笔记《JAVA并发编程的艺术》 第四章 Java并发编程基础 4.3 线程间的通信
4.3 线程间的通信 4.3.1 volatile和synchronized关键字 关键字volatile可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新到共享内存,它能保证所有线程对变量访问的可见性。 关键字synchronized可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法...原创 2018-08-01 10:33:36 · 202 阅读 · 0 评论 -
读书笔记《JAVA并发编程的艺术》 第四章 Java并发编程基础 4.2 启动和终止线程
4.2 启动和终止线程 4.2.1 构造线程 JDK1.8中java.lang.Thread类中的init方法源码: private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc) { if (name ...原创 2018-07-31 11:27:38 · 164 阅读 · 0 评论 -
读书笔记《JAVA并发编程的艺术》 第三章 Java内存模型 3.7 happens-before
3.7 happens-before 3.7.1 JMM的设计 设计意图 程序员对内存模型的使用 编译器和处理器对内存模型的实现 由于这两个因素相互矛盾,JSR-133专家组在设计JMM时的核心目标就是找到一个好的平衡点:一方面,要为程序员提供足够强的内存可见性保证;另一方面,对编译器和处理器的限制要尽可能地放松。 3.7.2 happens-before的定义 《JSR-13...原创 2018-07-30 10:51:48 · 283 阅读 · 0 评论 -
读书笔记《JAVA并发编程的艺术》 第三章 Java内存模型 3.6 final域的内存语义
3.6 final域的内存语义 3.6.1 final域的重排序规则 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。 示例代码如下: public clas FinalExample{ int i ; ...原创 2018-07-26 11:19:31 · 177 阅读 · 0 评论 -
读书笔记《JAVA并发编程的艺术》 第三章 Java内存模型 3.5 锁的内存语义
3.5 锁的内存语义 3.5.1 锁的释放–获取建立的happens-before关系 锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。 3.5.2 锁的释放后和获取的内存语义 当线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中。 当线程获取锁时,JMM会把该线程对应的本地内存置为无效。 总结:锁释放与volatile写有相同的语义...原创 2018-07-26 09:56:33 · 180 阅读 · 0 评论 -
读书笔记《JAVA并发编程的艺术》 第三章 Java内存模型 3.4 volatile的内存语义
3.4 volatile的内存语义 3.4.1 volatile的特性 理解volatile特性的一个好方法是对volatile变量的单个读、写,看成是使用同一个锁对这些单个读、写操作做了同步。 class VolatileFeaturesExample{ volatile long v1 = 0L; //使用volatile声明64位的long型变量 public v...原创 2018-07-25 16:33:11 · 206 阅读 · 0 评论 -
读书笔记《JAVA并发编程的艺术》 第三章 Java内存模型 3.3 顺序一致性
3.3 顺序一致性 3.3.1 数据竞争与顺序一致性 JMM对正确同步的多线程程序的内存一致性做了如下的保证: 如果程序是正确同步的,程序的执行将具有顺序一致性(Sequentially Consistent)—— 即程序的执行结果与该程序在顺序一致性内存模型中的执行结果相同。 3.3.2 顺序一致性内存模型 一个线程中的所有操作必须按照程序的顺序来执行 (不管程序是否同步)所有线...原创 2018-07-25 13:34:00 · 198 阅读 · 0 评论 -
读书笔记《JAVA并发编程的艺术》 第三章 Java内存模型 3.2 重排序
3.2 重排序 重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。 3.2.1 数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。 数据依赖性分为以下三种: 写后读 写后写 读后写 这里所说的数据依赖性仅针对于单个处理器中执行的指令序列和单个线程中执行的操作。 3.2.2 as-if-serial语...原创 2018-07-24 17:07:35 · 236 阅读 · 0 评论 -
读书笔记《JAVA并发编程的艺术》 第五章 Java中的锁 5.6.2 Condition的实现分析
5.6.2 Condition的实现分析 ConditionObject是同步器AbstractQueuedSynchronizer的内部类,因为Condition的操作需要获取相关联的锁,所以作为同步器的内部类也较为合理。 关于Condition的实现,主要包括:等待队列、等待和通知。 等待队列 等待队列是一个FIFO的队列,在队列中的每个节点都包含了一个线程引用,该线程就是在Cond...原创 2018-08-08 11:23:28 · 257 阅读 · 0 评论