一、阻塞队列
1、在多线程领域,所谓阻塞,在某些情况下会挂起线程,一旦条件满足,被挂起的线程又会自动被唤醒
2、ArrayBlockingQueue(效率高)和LinkedBlockingQueue是两个最常用的阻塞队列,一般情况下用来处理多线程间的生产者消费者问题。

二、并发队列
ConcurrentLinkedQueue

传统方式下用Collections工具类提供的synchronizedCollection方法来获得同步集合。

三、同步集合类
java5中还提供了如下一些同步集合类:
> java.util.concurrent - Java并发工具包
> ConcurrentHashMap 进行HashMap的并发操作,用来替代Collections.synchronizedMap(m)方法。
> ConcurrentSkipListMap 实现了SortedMap<K,V>,类似于TreeMap
> ConcurrentSkipListSet 实现了SortedSet, 类似于TreeSet
> CopyOnWriteArrayList
> CopyOnWriteArraySet
注:CopyOnWriteArrayList和CopyOnWriteArraySet,最适合于读操作通常大大超过写操作的情况。

传统方式下Collection在迭代时,不允许对集合进行修改,使用Iterator对集合进行迭代时也不能修改集合;其中CopyOnWriteArrayList在遍历的时候修改是不会出错的,实现方法是读写分离。

四、ReentrantLock
Condition实现线程间的通信,类似在线程中的Object.wait()和Object.notify()
eg、 private Lock lock = new ReentrantLock(); // 账户锁
private Condition _save = lock.newCondition(); // 存款条件
private Condition _draw = lock.newCondition(); // 取款条件

五、ReadWriteLock--实现读写锁
eg、private ReadWriteLock rwl = new ReentrantReadWriteLock();
rwl.readLock();
rwl.writeLock();

六、线程池,5种
缓存线程池、固定大小线程池、调度线程池、单例线程池、自定义线程池(参数:线程数、最大线程数、空闲时间、时间单位、队列)

七、生产消费模式
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue、ArrayBlockingQueue

八、synchronized锁和ReentrantLock锁的区别

synchronized是在JVM层面上实现的,可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中

在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;

九、CountDownLatch、CyclicBarrier(同步屏障)、信号灯区别

1、CyclicBarrier 多个线程相互等待,直到所有的线程都完成,如果他们之间任何一个线程没有完成,所有的线程都必须等待。
eg、await()、getNumberWaiting()

2、CountDownLatch 控制多个线程的执行顺序,调用await()方法的任务将一直阻塞等待,直到这个CountDownLatch对象的计数值countDown()减到0为止。
eg、有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行。

3、Semaphore 信号灯,场景:停车场运作、限流
假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。

// 获取许可
semp.acquire();
...
// 访问完后,释放
semp.release();

Java多线程同步集合--并发库高级应用的更多相关文章

  1. Java多线程(三) —— 线程并发库之总体架构

    对java并发库一直觉得很神秘,决定好好研究一下. 参考文献: https://blog.csdn.net/hp910315/article/details/50963095 http://www.b ...

  2. java 多线程 同步 观察者 并发集合的一个例子

    //第一版 package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type; import org.springfram ...

  3. Java多线程(六) —— 线程并发库之并发容器

    参考文献: http://www.blogjava.net/xylz/archive/2010/07/19/326527.html 一.ConcurrentMap API 从这一节开始正式进入并发容器 ...

  4. Java多线程(五) —— 线程并发库之锁机制

    参考文献: http://www.blogjava.net/xylz/archive/2010/07/08/325587.html 一.Lock与ReentrantLock 前面的章节主要谈谈原子操作 ...

  5. Java多线程(四) —— 线程并发库之Atomic

    一.从原子操作开始 从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包,而Queue,很多情况下使用到了Atomic操作,因此首先从这里开始). 很多情况下 ...

  6. java多线程与线程并发三:线程同步通信

    本文章内容整理自:张孝祥_Java多线程与并发库高级应用视频教程. 有些时候,线程间需要传递消息,比如下面这道面试题: 子线程循环10次,然后主线程循环100次,然后又回到子线程循环50次,然后再回到 ...

  7. java多线程与线程并发二:线程互斥

    本文章内容整理自:张孝祥_Java多线程与并发库高级应用视频教程 当两条线程访问同一个资源时,可能会出现安全隐患.以打印字符串为例,先看下面的代码: // public class Test2 { p ...

  8. java多线程与线程并发一:线程基础回顾

    本文章内容整理自:张孝祥_Java多线程与并发库高级应用视频教程 线程简单来讲就是程序正在做的事情.多线程即一个程序同时做多件事情,一个线程就是一件事情. 在java中创建线程的方法有两种. 方法一是 ...

  9. Java多线程同步问题的探究

    一.线程的先来后到——问题的提出:为什么要有多线程同步?Java多线程同步的机制是什么? http://www.blogjava.net/zhangwei217245/archive/2010/03/ ...

随机推荐

  1. 第74讲:从Spark源码的角度思考Scala中的模式匹配

    今天跟随王老师学习了从源码角度去分析scala中的模式匹配的功能.让我们看看源码中的这一段模式匹配: 从代码中我们可以看到,case RegisterWorker(id,workerHost,.... ...

  2. 发邮件、排序、FIFO

      发送邮件.py:   import smtplib from email.mime.text import MIMEText   def email(receiver, title='标题', b ...

  3. codeforce864d

    D. Make a Permutation! time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  4. hdu 5054

    http://acm.hdu.edu.cn/showproblem.php?pid=5054 确定是否矩形中点 这都能hack成功,无语 #include <cstdio> #includ ...

  5. JVM虚拟机---本地接口(我还不太会)

    转载http://www.newhua.com/2008/0328/33542_2.shtml Java本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Ja ...

  6. [zjoi2010]cheese

    题目: 贪吃的老鼠(cheese.c/cpp/pas/in/out) 时限:每个测试点10秒 [问题描述] 奶酪店里最近出现了m只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产n块 ...

  7. Python自动化开发 - 生成器、迭代器

    本节内容 1.列表生成式 2.生成器 3.迭代器 一.列表生成式 需求:把列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]里,每个元素都加1 # 复制版,重新绑定 a = [0, 1, ...

  8. Android-Lock-多线程通讯(生产者 消费者)&等待唤醒机制

    此篇博客以 生产面包

  9. Android-HttpClient-Get请求获取网络图片设置壁纸

    第一种方式使用httpclient-*.jar (需要在网上去下载httpclient-*.jar包) 把httpclient-4.5.jar/httpclient-4.4.1.jar包放入到libs ...

  10. AlexNet详解2

    此处以caffe官方提供的AlexNet为例. 目录: 1.背景 2.框架介绍 3.步骤详细说明 5.参考文献 背景: AlexNet是在2012年被发表的一个金典之作,并在当年取得了ImageNet ...