[TOC]
java IO模型
BIO:JDK1.4之前的IO,阻塞IO
NIO:linux多路复用技术(select模式)实现IO事件的轮询
方式:同步非阻塞的模式,这种方式目前是主流的网络通信模式
Mina,netty 网络通信框架
AIO:jdk1.7(NIO2)才是实现真正的异步aio,学习linux epoll模式。
3.1.4 Volatile 变量
只有满足下面的所有的标准后,你才能使用volatile变量:
写入变量时并不依赖变量的当前值;或者能够确保只有单一的现场修改变量的值;
变量不需要与其他的状态变量共同参与不变约束;
而且,访问变量时,没有其他的原因需要加锁。
3.5.3 安全发布的模式
线程安全库中的容器提供了如下的线程安全保证
置入Hashtable、synchronizedMap、ConcurrentMap中的主键以及键值,会安全地发布到可以从Map获得它们的任意线程中,无论是直接获得还是通过迭代器获得;
置入Vector、CopyOnWriteArrayList、CopyOnWriteArraySet、synchronizedList或者synchronizedSet中的元素,会安全地发布到可以从容器中获得它的任意线程中;
置入BlockingQueue或者ConcurrentLinkedQueue的元素,会安全的发布到可以从队列中获得它们的任意线程中。
4.3 委托线程安全
ConcurrentHashMap 引入了一个“分段锁”的概念,由Segment数组结构和HashEntry数组结构组成.
CopyOnWriteArrayList CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。
同步控制:
Collection类中提供了多个synchronizedXxx方法,该方法返回指定集合对象对应的同步对象,从而解决多线程并发访问集合时线程的安全问题。java中常用的HashSet、ArrayList、HashMap都是线程不安全的,如果多条线程访问他们,而且多于一条的线程试图修改它们,则可能出错。以下方法直接将新建的集合传给了Collections的synchronizedXxx方法,这样就直接获取它们的线程安全实现版本。
public static void main(String[] args) { Collection c=Collections.synchronizedCollection(new ArrayList()); List l=Collections.synchronizedList(new ArrayList()); Set s=Collections.synchronizedSet(new HashSet()); Map m=Collections.synchronizedMap(new HashMap()); }
设置不可变集合:不可变集合对象只能访问不能修改
Collections有三类方法可返回一个不可变集合:
1、emptyXxx():返回一个空的不可变的集合对象 2、singletonXxx():返回一个只包含指定对象的,不可变的集合对象。 3、unmodifiableXxx():返回指定集合对象的不可变视图
public static void main(String[] args) {
//创建一个空的,不可变的List对象
List unmodList =Collections.emptyList();
//创建一个只有一个元素且不可变的set对象
Set unmodSet =Collections.singleton("唯一的");
Map a=new HashMap();
a.put("语文", 80);
a.put("java", 90);
//返回map对象对应的不可变版本
Map unmodMap =Collections.unmodifiableMap(a);
//以下代码都将引发UnsupportedOperationException异常
unmodList.add("hello");
unmodSet.add("kitty");
unmodMap.put("语文", 70)
}
5.2 并发容器
Java 5.0 添加了并发容器 ConcurrentHashMap ConcurrentLinkedQueue Priority Queue
java 6 加入了 ConcurrentSkipListMap ConcurrentSkipListSet
5.3 阻塞队列
BlockQueue的实现
FIFO队列 LinkedBlockingQueue和ArrayBlockingQueue 优先级顺序排列的队列 PriorityBlockingQueue
5.3.3 双端
java 6 新增Deque和BlockingDeque,Deque是一个双端队列,允许高效地在头和尾分别进行插入和移除。 实现它们的是ArrayDeque和LinkedBlockingDeque。