![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java并发编程艺术学习笔记
闪电侠-公子
软件开发!
展开
-
并发编程基础知识
并发编程基础知识 Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令 上下文切换 CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所...原创 2019-09-02 20:00:26 · 108 阅读 · 0 评论 -
2_volatile
volatile 可见性 可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。volatile它在多处理器开发中保证了共享变量的“可见性”。如果volatile变量修饰符使用恰当的话,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。 volatile的定义 Java语言规范第3版中对volatile的定义如下:Java编程语言...原创 2019-09-02 20:01:29 · 94 阅读 · 0 评论 -
3_synchronized的实现原理与应用
synchronized的实现原理与应用 当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。 Java中的每一个对象都可以作为锁。具体表现为以下3种形式。 ·对于普通同步方法,锁是当前实例对象。 ·对于静态同步方法,锁是当前类的Class对象。 ·对于同步方法块,锁是Synchonized括号里配置的对象。 从JVM规范中可以看到Synchonized在JVM里的实现...原创 2019-09-02 20:04:14 · 133 阅读 · 0 评论 -
4、Java内存模型的基础
Java内存模型的基础 1、并发编程模型的两个问题 在并发编程中,需要了解并会处理这两个关键问题: 1.1、线程之间如何通信? 通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。 a) 在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。(重点) b) 在消息传递的并发模型里,线程之间没有公共状态,线程之间必...原创 2019-09-08 17:22:37 · 119 阅读 · 0 评论 -
5、锁内存语义的实现
锁内存语义的实现 在ReentrantLock中,调用lock()方法获取锁;调用unlock()方法释放锁。 ReentrantLock的实现依赖于Java同步器框架AbstractQueuedSynchronizer(本文简称之为AQS)。AQS使用一个整型的volatile变量(命名为state)来维护同步状态,这个volatile变量是ReentrantLock内存语义实现的关键。 Ree...原创 2019-09-08 17:23:28 · 153 阅读 · 0 评论 -
6、concurrent包的实现
concurrent包的实现 由于Java的CAS同时具有volatile读和volatile写的内存语义,因此Java线程之间的通信现在有了下面4种方式。 1)A线程写volatile变量,随后B线程读这个volatile变量。 2)A线程写volatile变量,随后B线程用CAS更新这个volatile变量。 3)A线程用CAS更新一个volatile变量,随后B线程用CAS更新这个volat...原创 2019-09-08 17:24:13 · 95 阅读 · 0 评论 -
7、final域
final域 final域重排序规则 对于final域,编译器和处理器要遵守两个重排序规则: 1、在构造函数对final域的写入,与随后把这个构造的对象的引用赋值给一个引用变量,这两个操作不能重排序。 2、初次读final域的对象的引用,与随后初次读final域,这两个操作不能重排序。 public class FinalExample { int i; ...原创 2019-09-08 17:24:56 · 246 阅读 · 0 评论