对于每一种编程语言,理解它的内存模型是理所当然的重要.下面我们从jvm的内存模型来体会下java(不限java语言,严格来讲是JVM内存模型,所有JVM体系的变成语言均适用)的内存模型. 堆: 就是我们写程序new出来的对象存放的内存. 方法区:就是存放类字节码和常量的内存. 虚拟机栈:就是局部变量(方法内定义的变量以及方法的入参.返回值),线程栈的内存. 本地方法区: 就是jvm本地调用时使用的内存. 程序计数器:就是程序运行到字节码哪行的指示器的内存. 好了,看如下一段代码: 当我们执行上面…
说起线程,无法免俗首先要弄清楚的三个概念就是:进程.线程.协程.OK,那什么是进程,什么是线程,哪协程又是啥东西.进程:进程可以简单的理解为运行在操作系统中的程序,程序时静态代码,进程是动态运行着的代码,程序的运行需要向操作系统申请资源比如内存,文件句柄等,特别强调的是进程申请的资源都是独立的,也就是进程与进程之间资源是独立的.它被操作系统调度,所以进程是相对于操作系统的:线程:线程是进程中程序执行任务的那个,它共享着进程申请的资源:协程:可以简单的说是线程制造的轻量线程.讲完了基本的概念看看三…
转自:http://rainyear.iteye.com/blog/1734311 java线程内存模型 线程.工作内存.主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程有自己的工作内存 refreshing local memory to/from main memory must  comply to JMM rules 产生线程安全的原因 线程的working memory是cpu的寄存器和高速缓存的抽象描述:现在的计算机,cpu在计算的时候,并不总是从内存读…
public class Demo1 { private static boolean initFlag=false; public static void main(String[] args) throws InterruptedException { new Thread(new Runnable() { @Override public void run() { System.out.println("waiting data......"); while (!initFlag…
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨Lock对象. synchronized与java.util.concurrent.locks.Lock 的相同点:Lock能完成synchronized所实现的所有功能:主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一定要求程序员手工释放, 并且必须在fi…
其实关于线程的使用,之前已经写过博客讲解过这部分的内容: http://www.cnblogs.com/deman/category/621531.html JVM里面关于多线程的部分,主要是多线程是如何实现的,以及高效并发. 1.Java内存模型 CPU在运行的时候,不可能把所有的东西都放在寄存器里面,所有需要使用内存.这个内存就是我们知道的那个内存. 但是实际情况是,内存的读写速度于CPU的指令操作差了几个数量级.所以为了跟高效的使用CPU,就有高速缓存这么一个东西. 以下是Intel 酷睿…
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6536131.html  一:现代计算机的高速缓存 在计算机组成原理中讲到,现代计算机为了匹配 计算机存储设备的读写速度 与  处理器运算速度,在CPU和内存设备之间加入了一个名为Cache的高速缓存设备来作为缓冲:将运算需要用到的数据从内存复制到cache中,CPU可以在运算期间对cache进行高速的读写操作,运算结束后在从cache把数据同步回内存. Cache引出了一个新问题:缓存一致性.每个处理器有自…
一:现代计算机的高速缓存 在计算机组成原理中讲到,现代计算机为了匹配 计算机存储设备的读写速度 与  处理器运算速度,在CPU和内存设备之间加入了一个名为Cache的高速缓存设备来作为缓冲:将运算需要用到的数据从内存复制到cache中,CPU可以在运算期间对cache进行高速的读写操作,运算结束后在从cache把数据同步回内存. Cache引出了一个新问题:缓存一致性.每个处理器有自己的cache,而他们又共享一个主内存.当多个处理器的运算任务都设计同一内存区域时,将会导致各自的缓存数据不一致.…
八 Java内存模型与线程   1 Java内存模型     ---主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节.     ---此处的变量和Java中的变量有所区别,它包括类字段.实例字段和构成数组对象的元素,但不包括局部变量和方法参数.     ---Java内存模型规定:         · 所有的变量都存储在主内存中:         · 每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副拷贝,线程对变…
原子性: 原子性就是指该操作是不可再分的.不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作.简而言之,在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性.比如 a = 1: 非原子性: 也就是整个过程中会出现线程调度器中断操作的现象 类似"a ++"这样的操作不具有原子性,因为它可能要经过以下两个步骤: (1)取出 a 的值 (2)计算 a+1 如果有两个线程t1,t2在进行这样的操作.t1在第一步做完之后还没来得及加1操作就被线程调度器中断了,于是t…