合集目录 Java多线程专题2: JMM(Java内存模型) Java中Synchronized关键字的内存语义是什么? If two or more threads share an object, and more than one thread updates variables in that shared object, race conditions may occur. To solve this problem you can use a Java synchronized bl…
1. 并发编程的3个概念 并发编程时,要想并发程序正确地执行,必须要保证原子性.可见性和有序性.只要有一个没有被保证,就有可能会导致程序运行不正确. 1.1. 原子性 原子性:即一个或多个操作要么全部执行并且执行过程中不会被打断,要么都不执行. 一个经典的例子就是银行转账:从账户A向账户B转账1000元,此时包含两个操作:账户A减去1000元,账户B加上1000元.这两个操作必须具备原子性才能保证转账安全.假如账户A减去1000元之后,操作被打断了,账户B却没有收到转过来的1000元,此时就出问…
目录 计算机系统的一致性 Java内存模型 内存模型的3个重要特征 原子性 可见性 有序性 指令重排序 volatile关键字 保证可见性和防止指令重排 不能保证原子性 计算机系统的一致性 在现代计算机操作系统中,多任务处理几乎是一项必备的功能,因为嵌入了多核处理器,计算机系统真正做到了同一时间执行若干个任务,是名副其实的多核系统.在多核系统中,为了提升CPU与内存的交互效率,一般都设置了一层 "高速缓存区" 作为内存与处理器之间的缓冲,使得CPU在运算的过程中直接从高速缓存区读取数据…
JMM Java Memory Model,Java内存模型,属于语言级的内存模型 并发编程中存在的问题: 如何通信:用于线程之间交换信息.两种方式:共享内存,消息传递 如何同步:用于控制不同线程间操作发生的相对顺序.共享内存的同步是显式的,消息传递的同步是隐式的,因为消息发送必须在消息接受之前,已经隐式包含了这个顺序关系 Java并发采用的是共享内存模型,内存模型的抽象结构如下图: 线程A和线程B通信的两个步骤: 线程A把本地内存中更新过的共享变量刷新到主内存中去 线程B去主内存中读取线程A之…
JMM 调用栈&本地变量在线程栈上 对象整体在堆上(包括其本地变量,不论类型),栈有其引用即可访问, 线程调用同一个对象时,是访问该对象的私有拷贝 每个CPU有自己的高速缓存 高速缓存存在意义:解决cpu执行速度快,主存读取慢的速度不匹配问题 和硬件内存架构关联 硬件内存架构不区分栈和堆,大部分栈和堆出现在主存,小部分高速缓存,更小部分寄存器 JMM抽象结构图 线程的本地内存是一个抽象概念,涵盖缓存.写缓冲区.寄存器等硬件部分 线程的工作缓存是线程所有的寄存器和高速缓存的朝向描述 不同内存通信必…
Java内存模型 主内存与工作内存 Java内存模型主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节.此处的变量(Variable)与Java编程中的变量略有区别,它包括实例变量/静态字段和构成数组对象的元素,不包括局部变量和方法参数(线程私有).为获得较好的执行效能,Java内存模型并没有限制执行引擎使用处理器的特定寄存器或缓存来和主内存进行交换,也没有限制即时编译器调整代码执行顺序这类权利. Java内存模型规定所有变量都存储在主存(Mai…
内存模型的作用是定义变量的访问规则.包含:实例字段.静态字段.构成数组对象的元素.不包括局部变量和方法参数等线程私有变量. JMM所有变量都在主存,每个线程都有自己的工作内存.线程的工作内存中保存了线程中变量的拷贝副本.线程对变量的所有操作都在工作内存中进行,不同线程间的值传递需要通过主存完成. 过程: A把自己的变量刷新到主存. B到主存中读A刷新的,复制到自己的内存中. || \/ 可见性:Volatile的工作原理:变量修改后新值立刻更新到主存,使用前从主存中刷新. Reentrantlo…
尊重原创:http://blog.csdn.net/suifeng3051/article/details/52611310 Java内存模型即JavaMemory Model,简称JMM.JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式.JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的. 如果我们要想深入了解Java并发编程,就要先理解好Java内存模型.Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步.原始的Java内存模型…
多线程概念的引入是人类又一次有效压寨计算机的体现,而且这也是非常有必要的,因为一般运算过程中涉及到数据的读取,例如从磁盘.其他系统.数据库等,CPU的运算速度与数据读取速度有一个严重的不平衡,期间如果按一条线程执行将会在很多节点产生阻塞,使计算效率低下.另外,服务器端是java最擅长的领域,作为服务器必须要能同时响应多个客户端的请求,同样需要多线程的支持.在多线程情况下,高并发将带来数据的共享与竞争问题,tomcat作为中间件将多线程并发等细节尽量封装起来处理,使用户对多线程透明,更多地关注业务…
一.线程安全 1.  怎样让多线程下的类安全起来 无状态.加锁.让类不可变.栈封闭.安全的发布对象 2. 死锁 2.1 死锁概念及解决死锁的原则 一定发生在多个线程争夺多个资源里的情况下,发生的原因是每个线程拿到了某个(某些)资源不释放,同时等待着其他线程所持有的资源. 解决死锁的原则就是确保正确的获取资源的顺序,或者获取资源时使用定时尝试机制. 2.2 常见的死锁: 简单顺序死锁: package com.study.deadlock.bank; /** * 简单顺序死锁 * 解决办法:保证拿…