2019独角兽企业重金招聘Python工程师标准>>>

最近在网上看到一个将concurrent包的系列文章,仔细读了一遍,感觉不错。

分享一下:http://www.hetaoblog.com/myblogs/post/%E8%AF%B4%E4%B8%80%E8%AF%B4java%E7%9A%84concurrent%E5%8C%851-%E6%95%B4%E4%BD%93%E4%BB%8B%E7%BB%8D.jhtml

Concurrent包主要有三个package组成。java.util.concurrent:提供大部分关于并发的接口和类,如BlockingQueue,Callable,ConcurrentHashMap,ExecutorService, Semaphore等。

java.util.concurrent.atomic:提供所有原子操作的类, 如AtomicInteger, AtomicLong等; 
java.util.concurrent.locks:提供锁相关的类, 如Lock, ReentrantLock, ReadWriteLock, Condition等;

 CountDownLatch

CountDownLatch等待多个线程完成执行,这个类会等待多个子线程结束后才开始执行主线程的其他操作。直接上一个例子。

@Testpublic void testCountDown(){int count = 10;final CountDownLatch l = new CountDownLatch(count);for (int i = 0; i < count; ++i){final int index = i;new Thread(new Runnable() {@Overridepublic void run() {try {Thread.currentThread().sleep(3 * 1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("thread " + index + " has finished...");l.countDown();}}).start();}try {l.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("now all threads have finished");}

这个例子中,结束语句会在所有线程结束后再执行,否则会一直await。

Atomic类

Atomic相关类是线程安全的,支持无阻塞无锁定的操作set(),get(),getAndSet(), getAndIncrement(),getAndDecrement(),getAndAdd()

@Testpublic void testAtomic(){final int loopcount = 10000;int threadcount = 10;final NonSafeSeq seq1 = new NonSafeSeq();final SafeSeq seq2 = new SafeSeq();final CountDownLatch l = new CountDownLatch(threadcount);for(int i = 0; i < threadcount; ++i){final int index = i;new Thread(new Runnable() {@Overridepublic void run() {for(int j = 0; j < loopcount; ++j){seq1.inc();seq2.inc();}System.out.println("finished : " + index);l.countDown();}}).start();}try {l.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("both have finished....");System.out.println("NonSafeSeq:" + seq1.get());System.out.println("SafeSeq with atomic: " + seq2.get());}
class NonSafeSeq{private long count = 0;public void inc(){count++;}public long  get(){return count;}
}class SafeSeq{private AtomicLong count  = new AtomicLong(0);public void inc(){count.incrementAndGet();}public long get(){return count.longValue();}
}

输出结果如下:

both have finished....
NonSafeSeq:93212
SafeSeq with atomic: 100000

很明显看出来在原始方法中即使做了10000次相加操作也没有办法保证多线程下的一致性。使用AtomicLong进行相加可以避免这样的问题。

ReentrantLock类

之前一直是使用synchronized关键字来保证线程间的同步。concurrent包提供了ReentrantLock类,该类提供lock()和unlock()方法

1. 是更好的性能, 
2. 提供同一个lock对象上不同condition的信号通知 
3. 还提供lockInterruptibly这样支持响应中断的加锁过程,意思是说你试图去加锁,但是当前锁被其他线程hold住,然后你这个线程可以被中断;

这里直接上下相关lock操作的代码

class SafeSeqWithLock{private long count = 0;private ReentrantLock lock = new ReentrantLock();public void inc(){lock.lock();try{count++;}finally{lock.unlock();}}public long get() {return count;}}

可以看到,这里在++操作之前先lock了,然后再执行了unlock操作。

ReadWriteLock

读锁可以有很多个锁同时上锁,只要当前没有写锁; 
写锁是排他的,上了写锁,其他线程既不能上读锁,也不能上写锁;同样,需要上写锁的前提是既没有读锁,也没有写锁;

试图获得写锁的线程只有当另外一个线程将读锁释放了以后才可以获得

@Testpublic void testRWLock_getw_onr(){ReentrantReadWriteLock lock = new ReentrantReadWriteLock();final Lock rlock = lock.readLock();final Lock wlock = lock.writeLock();final CountDownLatch l  = new CountDownLatch(2);// start r threadnew Thread(new Runnable() {@Overridepublic void run() {System.out.println(new Date() + "now to get rlock");rlock.lock();try {Thread.currentThread().sleep(3 * 1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(new Date() + "now to unlock rlock");rlock.unlock();l.countDown();}}).start();// start w threadnew Thread(new Runnable() {@Overridepublic void run() {System.out.println(new Date() + "now to get wlock");wlock.lock();System.out.println(new Date() + "now to unlock wlock");wlock.unlock();l.countDown();}}).start();try {l.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(new Date() + "finished");}

总结一下。这里是concurrent包中常用的几个类。集中涉及了多线程,并发控制,锁的相关机制。

转载于:https://my.oschina.net/zimingforever/blog/143914

java的concurrent包相关推荐

  1. java.util.concurrent包API学习笔记

    newFixedThreadPool 创建一个固定大小的线程池. shutdown():用于关闭启动线程,如果不调用该语句,jvm不会关闭. awaitTermination():用于等待子线程结束, ...

  2. 【ArrayList】为什么java.util.concurrent 包里没有并发的ArrayList实现?

    2019独角兽企业重金招聘Python工程师标准>>> 为什么java.util.concurrent 包里没有并发的ArrayList实现? 问:JDK 5在java.util.c ...

  3. 高并发编程基础(java.util.concurrent包常见类基础)

    JDK5中添加了新的java.util.concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法 ...

  4. java.util.concurrent 包下面的所有类

    java.util.concurrent 包下面的所有类 原子操作数类: java.util.concurrent.atomic.AtomicBoolean.class java.util.concu ...

  5. java.util.concurrent包

    本文是我们学院课程中名为Java Concurrency Essentials的一部分 . 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如原子性,同步和线程安全之 ...

  6. Java高并发编程学习(三)java.util.concurrent包

    简介 我们已经学习了形成Java并发程序设计基础的底层构建块,但对于实际编程来说,应该尽可能远离底层结构.使用由并发处理的专业人士实现的较高层次的结构要方便得多.要安全得多.例如,对于许多线程问题,可 ...

  7. java concurrent 框架,java.util.concurrent 包下的 Synchronizer 框架

    看完书 java concurrency in practice 当然是想找点啥好玩的东东玩玩. 当看到了Doug Lee 的论文 << The java.util.concurrent ...

  8. java.util.concurrent包详细分析--转

    原文地址:http://blog.csdn.net/windsunmoon/article/details/36903901 概述 Java.util.concurrent 包含许多线程安全.测试良好 ...

  9. jdk8中java.util.concurrent包分析

    并发框架分类 1. Executor相关类 Interfaces. Executor is a simple standardized interface for defining custom th ...

最新文章

  1. ItemsControl 解析
  2. 迁移学习与图神经网络“合力”模型:用DoT-GNN克服组重识别难题
  3. 2015年6月9日_诗词学习
  4. LeetCode 79 Word Search(单词查找)
  5. 书摘---创业36条军规1:创业是怎么回事
  6. 用Python玩转时序数据
  7. PHP登录表单提交前端验证,form表单提交前先用ajax进行验证(前端)
  8. 数据结构上机实践第四周项目7 - 多项式求和
  9. Ubuntu系统下面软件安装更新命令
  10. jflash烧录教程_Flash基础入门之J-Link固件烧录以及使用J-Flash向arm硬件板下载固件程序...
  11. 苏宁易购,淘宝网,京东商城,百万级价格数据海量抓取
  12. ruby trainning - decryption
  13. conda加速器mamba使用
  14. Hadamard 积, Kronecker 积 和 Khatri- Rao积
  15. Java基础-基础知识汇总
  16. 往证书图片上填充文字内容
  17. How to increase our brain power
  18. Check Point R80.10官方共21个产品文档翻译汉化
  19. 招聘|蔚来汽车招感知算法工程师(Intern)
  20. Python脚本翻译英文到汉语

热门文章

  1. Windows:系统环境变量配置提示系统环境变量太大的问题三种解决方案亲测可用
  2. 【模型解读】从2D卷积到3D卷积,都有什么不一样
  3. 全球及中国生物仿制药淋巴细胞调节剂行业需求潜力分析及及投资规划研究报告2021-2027年
  4. 中国汽车电器运营现状与十四五发展规划报告2022-2028年版
  5. 计算机生活工作原理,计算机基本工作原理是什么?
  6. 随机数排列JAVA_随机数生成器,按排序顺序
  7. 将字符串的首字母变为大写
  8. 福大软工1816:项目测评
  9. 获取url后的指定参数
  10. Kibana安装及简单使用