
Java并发编程的艺术
h_lizeming
这个作者很懒,什么都没留下…
展开
-
Java并发编程的艺术--一
最近在看java并发编程艺术这一本书。这本书怎么说捏,前面三章写得听深入的。为了方便以后自己查看特地趁着复习时间,写下自己对这本书的感悟,好了,言归正传。一:为什么会出现并发编程 因为硬件摩尔定律失效,人们不得不把从软件身上找出路了(本应该是硬件设计师处理的问题,无法解决后交给了软件设计师),这样就是出现多核处理(多线程 高并发)。例如:上下文切换问题、死锁问题、以及首受限于硬件...原创 2019-03-08 15:33:52 · 188 阅读 · 0 评论 -
高并发的理解一
前言对于java并发程序,我们首先要了解的就是JMM,也就是内存模型,他可以提供内存的可见性保障,针对正确同步的多线程程序而言,因为JMM的存在,使得我们的程序按照我们理解的顺序进行执行(实际并不是),所以,本篇文章的中心点是JMM,并引申出JMM相关的知识点JMM的概念及作用Q:java内存模型是什么,他的定义是什么,他做了什么A:java内存模型就是JMM,他定义了线程与内...转载 2019-03-09 21:07:56 · 295 阅读 · 0 评论 -
CAS操作
3.1 CAS操作3.1.1 什么是CAS?使用锁时,线程获取锁是一种悲观锁策略,即假设每一次执行临界区代码都会产生冲突,所以当前线程获取到锁的时候同时也会阻塞其他线程获取该锁。而CAS操作(又称为无锁操作)是一种乐观锁策略,它假设所有线程访问共享资源的时候不会出现冲突,既然不会出现冲突自然而然就不会阻塞其他线程的操作。因此,线程就不会出现阻塞停顿的状态。那么,如果出现冲突了怎么办?无锁操...原创 2019-03-09 21:06:53 · 305 阅读 · 0 评论 -
重排序
为更加快的执行 采用流水线的形式执行代码 所以代码之间采用了重排序 。所以才有线程之间或者是单线程之间 可见性 顺序一致性问题(别的线程看到的顺序是否 与本线程实际执行的顺序一致)。想要解决这两个问题 需要:1)单线程采取正确的指令重排序。2)多线程之间要正确的同步,那如何保证正确的同步捏 可以采取sny(jdk1.5)或者是 lock。通过加锁也可以让多个处理...原创 2019-03-09 21:02:56 · 165 阅读 · 0 评论 -
as-if-serial
as-if-serial语义的意思指:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。编译器,runtime和处理器都必须遵守as-if-serial语义。为了遵守as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。但是,如果操作之间不存在数据依赖关系,这些操作可能被编译器和处理器重排序。as...转载 2019-03-09 20:49:50 · 2875 阅读 · 0 评论 -
java并发编程中主要几种依赖
数据依赖:如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。 控制依赖:前序操作是条件语句(if, while...), 则后续操作和前序之间就产生了控制依赖关系.控制依赖一般来说不会影响单线程的执行结果,但是多线程程序就难了 下面将详细解释。 间接依赖:数据依赖性分为下面三种情况:名称 示例 说明 写后读 a = 1...原创 2019-03-09 20:47:13 · 541 阅读 · 0 评论 -
happens-before(关键)
在理论层次上分析,只要保证一下三点就可以保证多线程之间正确的同步。;可见性:一个线程对主内存的修改可以及时的被其他线程观察到。 有序性:一个线程观察其他线程中的指令执行顺序,由于指令 重排序的存在,该观察结果一般杂乱无序。 原子性:提供了互斥访问。冲突访问 对同一个共享字段或数组元素存在两个访问(读或写),且至少有一个访问是写操作,就称作有冲突。当程序包含两个没有被 happens-be...原创 2019-03-09 20:19:20 · 311 阅读 · 0 评论 -
volatile内存语意
volatile的写锁对应的是锁的锁定volatile的读锁对应的是锁的释放Q:为什么volatile的读写与普通的读写要通过内存屏障来保障不能重排序捏?1:v写之前的操作不能与v写进行重排序2:v读之后的操作不能与v读进行重排序3:v写不能与v读进行重排序volatile的读写锁在内存语义上看就是线程与线程之间的通信。针对v写的内存语意,v写会将缓存中的数据全部刷到主内存...原创 2019-03-09 17:08:56 · 120 阅读 · 0 评论 -
volatile只保证可见性 不一定保证原子性
volatile只能保证变量的可见性,无法保证对变量的操作的原子性。还是以最常用的i++来说吧,包含3个步骤1,从内存读取i当前的值2,加13,把修改后的值刷新到内存对于普通变量来说多线程下1,2之间被中断,其它线程修改了i的值,那原来已经在1,2之间被中断的线程的i的值就已经无效了,所以多线程是不安全的。 另外对于普通变量来说,步骤1并不是每次都会从内存中读取,步骤3也...原创 2019-03-08 17:58:02 · 650 阅读 · 0 评论 -
Volatile的内存可见性
内存模型什么是JAVA 内存模型?Java Memory Model (JAVA 内存模型)是描述线程之间如何通过内存(memory)来进行交互。 具体说来, JVM中存在一个主存区(Main Memory或Java Heap Memory),对于所有线程进行共享,而每个线程又有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作并非发...原创 2019-03-08 16:30:53 · 288 阅读 · 0 评论 -
高并发的理解二
前言本章着重聊一聊线程本身的特性,对于多线程并发编程来说,如果不能了解线程的组成和特性,那么对于后续AQS或是线程池的理解都会受到影响线程基本介绍线程是操作系统调度的基本单元,每一个线程都有自己的程序计数器,虚拟机栈,线程在执行方法的时候,都会创建一个相应的栈帧用于保存和计算相关数据线程的工作结构和jvm之间的关系对于线程的基本构造,首先要了解的就是程序计数器和虚拟机...转载 2019-03-09 21:11:25 · 128 阅读 · 0 评论