Java多线程同步集合--并发库高级应用
一、阻塞队列
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多线程同步集合--并发库高级应用的更多相关文章
- Java多线程(三) —— 线程并发库之总体架构
对java并发库一直觉得很神秘,决定好好研究一下. 参考文献: https://blog.csdn.net/hp910315/article/details/50963095 http://www.b ...
- java 多线程 同步 观察者 并发集合的一个例子
//第一版 package com.hra.riskprice; import com.hra.riskprice.SysEnum.Factor_Type; import org.springfram ...
- Java多线程(六) —— 线程并发库之并发容器
参考文献: http://www.blogjava.net/xylz/archive/2010/07/19/326527.html 一.ConcurrentMap API 从这一节开始正式进入并发容器 ...
- Java多线程(五) —— 线程并发库之锁机制
参考文献: http://www.blogjava.net/xylz/archive/2010/07/08/325587.html 一.Lock与ReentrantLock 前面的章节主要谈谈原子操作 ...
- Java多线程(四) —— 线程并发库之Atomic
一.从原子操作开始 从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包,而Queue,很多情况下使用到了Atomic操作,因此首先从这里开始). 很多情况下 ...
- java多线程与线程并发三:线程同步通信
本文章内容整理自:张孝祥_Java多线程与并发库高级应用视频教程. 有些时候,线程间需要传递消息,比如下面这道面试题: 子线程循环10次,然后主线程循环100次,然后又回到子线程循环50次,然后再回到 ...
- java多线程与线程并发二:线程互斥
本文章内容整理自:张孝祥_Java多线程与并发库高级应用视频教程 当两条线程访问同一个资源时,可能会出现安全隐患.以打印字符串为例,先看下面的代码: // public class Test2 { p ...
- java多线程与线程并发一:线程基础回顾
本文章内容整理自:张孝祥_Java多线程与并发库高级应用视频教程 线程简单来讲就是程序正在做的事情.多线程即一个程序同时做多件事情,一个线程就是一件事情. 在java中创建线程的方法有两种. 方法一是 ...
- Java多线程同步问题的探究
一.线程的先来后到——问题的提出:为什么要有多线程同步?Java多线程同步的机制是什么? http://www.blogjava.net/zhangwei217245/archive/2010/03/ ...
随机推荐
- 第74讲:从Spark源码的角度思考Scala中的模式匹配
今天跟随王老师学习了从源码角度去分析scala中的模式匹配的功能.让我们看看源码中的这一段模式匹配: 从代码中我们可以看到,case RegisterWorker(id,workerHost,.... ...
- 发邮件、排序、FIFO
发送邮件.py: import smtplib from email.mime.text import MIMEText def email(receiver, title='标题', b ...
- codeforce864d
D. Make a Permutation! time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- hdu 5054
http://acm.hdu.edu.cn/showproblem.php?pid=5054 确定是否矩形中点 这都能hack成功,无语 #include <cstdio> #includ ...
- JVM虚拟机---本地接口(我还不太会)
转载http://www.newhua.com/2008/0328/33542_2.shtml Java本地接口(Java Native Interface (JNI))允许运行在Java虚拟机(Ja ...
- [zjoi2010]cheese
题目: 贪吃的老鼠(cheese.c/cpp/pas/in/out) 时限:每个测试点10秒 [问题描述] 奶酪店里最近出现了m只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产n块 ...
- Python自动化开发 - 生成器、迭代器
本节内容 1.列表生成式 2.生成器 3.迭代器 一.列表生成式 需求:把列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]里,每个元素都加1 # 复制版,重新绑定 a = [0, 1, ...
- Android-Lock-多线程通讯(生产者 消费者)&等待唤醒机制
此篇博客以 生产面包
- Android-HttpClient-Get请求获取网络图片设置壁纸
第一种方式使用httpclient-*.jar (需要在网上去下载httpclient-*.jar包) 把httpclient-4.5.jar/httpclient-4.4.1.jar包放入到libs ...
- AlexNet详解2
此处以caffe官方提供的AlexNet为例. 目录: 1.背景 2.框架介绍 3.步骤详细说明 5.参考文献 背景: AlexNet是在2012年被发表的一个金典之作,并在当年取得了ImageNet ...