JDK并发包

作者: 五人行 | 来源:发表于2016-12-15 21:48 被阅读0次

java高并发程序设计 - 网易云课堂

一、重入锁

重入锁是synchronized,Object.wait(),Object.notify()和替代品;

重入锁的类是:java.util.concurrent.locks.ReentrantLock;

代码如:

lock=new ReentrantLock();

lock.lock();   //加锁

.....

lock.unlock();//解锁

二、中断响应

lock=new ReentrantLock();

lock2=new ReentrantLock();

lock.lockInterruptibly();  //请求锁

.....

lock2.interrupt();   //发出中断信号

三、锁申请等待限时

lock.tryLock();返回值是boolean类型;接收两个参数,一个表示等待时长,第二个表示记时单位;没参数时,是不等待;如果获取了锁,返回true;

与lock.tryLock()对应的方法解锁lock.unLock();

四、公平锁

默认情况下,锁是非公平的;synchronized实现的锁就是非公平的;

lock=new ReentrantLock(true);这就是公平锁,公平锁耗资源;

五、ReenreantLock的几个重要方法:

lock();获得锁,如果锁已经被占用,则等待;

lockInterruptibly();获得锁,但优先响应中断;

tryLock();尝试获得锁,如果成功获取,返回true;否则返回false;

tryLock(long time,TimeUnit unit);同上,只是在给定的时间内尝试去获得锁;

unlock();释放锁;

六、重入锁的好搭档,Condition条件

await();使当前线程等待,同时释放当前的锁;当其它线程singal()之后,此线程会重新获得锁并继续执行。

awaitUninterruptibly();与await()方法基本想同,但不会在等待过程中响应中断;

singal()用于唤醒一个在等待中的线程;

七、信号量(semaphore)

信号量可以指定多个线程,同时访问某一个资源;synchronized与重入锁ReentrantLock,一次都只允许一个线程访问一个资源;

其构造方法:

public Semaphore(int permits);参数表示可以申请多少个许可;

public Semphore(int permits,boolean fair);第二个参数表示是否公平;

acquire()尝试获得一个准入的许可,若无法获得,则线程会等待,直到有线程释放一个许可或者当前线程被中断;

acquireUninterruptibly()方法与acquire()方法类似,但不响应中断;

tryAcquire()尝试获得一个许可,如果成功返回true,失败则返回false;

release()用于在线程访问资源结束后,释放一个许可;

八、读写分离锁(ReadWriteLock)

ReentrantReadWriteLock

九、多线程控制工具类

倒计时器 CountDownLatch;

循环栅栏 CyclicBarrier;

十、线程阻塞工具类

LockSupport

十一、线程池

避免系统频繁地创建和销毁线程,可以让创建的线程进行复用。

JDK提供了一套Executor框架,其本质就是一个线程池。

工厂方法:

newFixedThreadPool();返回一个固定线程数量的线程池。

newSingleThreadExecutor();返回只有一个线程的线程池;

newCachedThreadPool();

newSingleThreadScheduledExecutor();在给定的时间执行某任务。如在某个固定的延时之后执行,或者周期性执行某个任务;

十二、分而治之。Fork/Join框架

ForkJoinPool线程池

十三、JDK的并发容器

程序就是算法加数据结构;这些并发容器都是线程安全的。JDK提供的这些容器大部分在:java.util.concurrent包下。

并发集合:适合于多线程场合。

ConcurrentHashMap,一个线程安全的HashMap;

CopyOnWriteArrayList,用在读多写少的场合,是个线程安全的list,其性能好于Vector;

ConcurrentLinkedQueue,是个线程安全的LinkedList;

BlockingQueue,是个接口,JDK内部通过链表(LinkedBlockingQueue)、数组(ArrayBlockingQueue)等方式实现了这个接口,表示阻塞队列,适用于数据共享的通道;

另外,Collections工具类可以将任意集合包装成线程安全的集合;如:

Map p=Collections.synchronizedMap(new HashMap());

ConcurrentSkipListMap的数据是有序的;

相关文章

  • JDK并发包

    java高并发程序设计 - 网易云课堂 一、重入锁 重入锁是synchronized,Object.wait(),...

  • 01_Java面试题_Java 基础

    1.JDK 和 JRE 有什么区别? JDK,开发java程序用的开发包,JDK里面有java的运行环境(JRE)...

  • JDK并发包-JDK并发容器

    除了同步控制,线程池等基本工具以外,JDK还准备了一大批好用的容器类。 1.1 并发集合 JDK提供的这些容器大部...

  • JDK并发包 - ExecutorCompletionServi

    1. 接口CompletionService 接口CompletionService设计目标在于将生产者和消费者解...

  • JDK并发包 - FutureTask

    1. FutureTask FutureTask实现了Runnable和Future接口,它主要用于包装真实cal...

  • java jdk并发包

    1.ReentrantLock 这个锁的意义相当于一个多线程安全的允许做某些事情的标志位,拥有该标志位则拥有执...

  • java基础-JDK环境搭建

    JDK与JRE JDK(Java Development Kit)称为Java开发包或Java开发工具,是一个编写...

  • J.U.C并发包简介

    J.U.C并发包简介 J.U.C并发包, 即java.util.concurrent包, 是JDK的核心工具包, ...

  • JDK1.8并发包之 -- CyclicBarrier

    前文讲述CountDownLatch,详见 JDK1.8并发包之 -- CountDownLatch,本文讲述与之...

  • 正则表达式笔记

    JDK1.4之后正则默认被JDK所支持,并且提供java.util.regex开发包,同时String类也支持直接...

网友评论

    本文标题:JDK并发包

    本文链接:https://www.haomeiwen.com/subject/ogrimttx.html