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。

posted @ 2020-02-28 21:06  my_flash  阅读(337)  评论(0)    收藏  举报