内存模型与线程

本篇主要用于盘点Java中常见的多线程知识 1.复杂的内存模型 何为Java的内存模型(JMM)? JMM实际上是为了避免C/C++在不同机器上内存适配的问题, 尝试定义程序中各个变量的访问规则, 而不是说简单的将内存划分为堆/栈. Java内存模型规定了两种内存: 工作内存(例如对应于虚拟机栈局部变量)与主内存(对应于堆的对象实例). 线程对变量的所有操作都必须在工作内存中进行, 而不能读写主内存中的变量. (以下内容摘自深入理解JVM虚拟机) 关于主内存与工作内存之间的交互协议, 即一个变量如何从主内存拷贝到工作内存. 如何从工作内存同步到主内存中的实现细节. java内存模型定义了8种操作来完成, 这8种操作每一种都是原子操作. 8种操作如下: i. lock(锁定):作用于主内存, 它把一个变量标记为一条线程独占状态. ii .unlock(解锁):作用于主内存, 它将一个处于锁定状态的变量释放出来,释放后的变量才能够被其他线程锁定. iii. read(读取):作用于主内存, 它把变量值从主内存传送到线程的工作内存中,以便随后的load动作使用. iv. load(载入):作用于工作内存, 它把read操作的值放入工作内存中的变量副本中. v. use(使用):作用于工作内存, 它把工作内存中的值传递给执行引擎,每当虚拟机遇到一个需要使用这个变量的指令时候,将会执行这个动作. vi. assign(赋值):作用于工作内存, 它把从执行引擎获取的值赋值给工作内存中的变量,每当虚拟机遇到一个给变量赋值的指令时候,执行该操作. vii. store(存储):作用于工作内存, 它把工作内存中的一个变量传送给主内存中,以备随后的write操作使用. vii. write(写入):作用于主内存, 它把store传送值放到主内存中的变量中. 并且必须满足如下规则: i. 不允许read和load、store和write操作之一单独出现, 以上两个操作必须按顺序执行, 但没有保证必须连续执行, 也就是说, read与load之间, store与write之间是可插入其他指令的. ii. 不允许一个线程丢弃它的最近的assign操作, 即变量在工作内存中改变了之后必须把该变化同步回主内存. iii. 不允许一个线程无原因地(没有发生过任何assign操作)把数据从线程的工作内存同步回主内存中. iv. … Continue reading “内存模型与线程”

Collection 与 HashMap

  本篇主要总结集合框架/Hashmap相关的内容 介绍之前先记住这张图 虚线(点/短线)分别表示了 Interface/Abstract class, 实线表示了 Class, 箭头表示了实现或者继承. 1.Collection 最基本的集合接口, 实现了一些基础方法, 例如 size(), isEmpty(), add(), remove(), contains(), clear() 等等. Collection 有三个子接口: List, Set, Queue. List下有AbstractList接口, Vector, Stack, ArrayList, LinkedList都实现了该接口.(LinkedList还实现了Deque/Queue接口) Set下有SortedSet和AbstractSet虚类, HashSet实现了AbstractSet虚类, TreeSet二者都实现了. (HashSet 是用HashMap实现) 2. TreeSet/TreeMap TreeSet/TreeMap可以看作 HashSet和HashMap的排序版本, 例如TreeSet可以使用迭代器迭代输出排序之后的Set. (Set中的类型需要支持Comparable接口.) TreeMap则可以实现HashMap的排序. 其具体实现是红黑树. 简单介绍一下红黑树, 满足以下几个性质的二叉搜索树即为红黑树: i. 节点是红色或者是黑色 ii. 根节点是黑色 iii. 叶子(Nil)结点是黑色 iv. 红色节点的子节点都是黑色 v. 从任何一个结点向下出发的所有路径都应该包含数量相等的黑色节点 … Continue reading “Collection 与 HashMap”

1 Comment so far