JAVA并发编程实践_java并发编程实践 笔记 2017

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值