第3章 JDK并发包(四)】的更多相关文章

3.2 线程复用:线程池 一种最为简单的线程创建和回收的方法类似如下代码: new Thread(new Runnable() { @Override public void run() { // do sth. } }).start(); 在run方法结束后,自动回收. 在真实的生产环境中,系统由于真实环境的需要,可能会开启很多线程来支撑其应用.而当线程数量过大时,反而会耗尽CPU和内存资源. 3.2.1 什么是线程池 为了避免系统频繁地创建和销毁线程,我们可以让创建的线程进行复用. 在使用线…
3.2.5 自定义线程创建:ThreadFactory 线程池的主要作用是为了线程复用,也就是避免了线程的频繁创建. ThreadFactory是一个接口,它只有一个方法,用来创建线程: Thread newThread(Runnable r); 当线程池需要新建线程时,就会调用这个方法. 下面的案例使用自定义的ThreadFactory,一方面记录了线程的创建,另一方面将所有的线程都设置为守护线程,这样,当主线程退出后,将会强制销毁线程池. public static void main(St…
3.3 不要重复发明轮子:JDK的并发容器 3.3.1 超好用的工具类:并发集合简介 JDK提供的这些容器大部分在java.util.concurrent包中. ConcurrentHashMap:这是一个高效的并发HashMap.可以理解为一个线程安全的HashMap. CopyOnWriteArrayList:这是一个List,从名字看就是和ArrayList是一族的.在读多写少的场合,这个List的性能非常好,远远好于Vector. ConcurrentLinkedQueue:高效的并发队…
3.1.2 重入锁的好搭档:Condition条件 它和wait()和notify()方法的作用是大致相同的.但是wait()和notify()方法是和synchronized关键字合作使用的,而Condition是与重入锁相关联的.通过Lock接口的Condition newCondition()方法可以生成一个与当前重入锁绑定的Condition实例.利用Condition对象,我们就可以让线程在合适的时间等待,或者在某一种特定的时刻得到通知,继续执行. Condition接口提供的基本方法…
3.1 多线程的团队协作:同步控制 3.1.1 synchronized的功能扩展:重入锁 重入锁可以完全替代synchronized关键字. 重入锁使用java.util.concurrent.locks.ReentrantLock类来实现.下面是一段最简单的重入锁使用案例: public class ReenterLock implements Runnable { public static ReentrantLock lock = new ReentrantLock(); public…
一,JDK并发包实际上就是指java.util.concurrent包里面的那些类和接口等 主要分为以下几类: 1,原子量:2,并发集合:3,同步器:4,可重入锁:5,线程池 二,原子量 原子变量主要有AtomicInteger,AtomicLong,AtomicBoolean等, 主要实现原理都是底层实现类CAS 即比较并交换,都有get,set,compareAndSet等方法,如++,--等也都是有自带方法实现 这些都是线程安全的,保证了多线程访问时候的可见性 import java.ut…
JDK并发包之同步控制 一.重入锁 重入锁使用java.util.concurrent.locks.ReentrantLock来实现.示例代码如下: public class TryReentrantLock implements Runnable{ static ReentrantLock lock=new ReentrantLock(); static int i=0; @Override public void run() { for(int j=0;j<10000;j++){ lock.…
JDK内部提供了大量实用的API和框架.本章主要介绍这些JDK内部功能,主要分为3大部分: 首先,介绍有关同步控制的工具,之前介绍的synchronized就是一种同步控制手段,将介绍更加丰富的多线程控制方法. 其次,将详细介绍JDK对线程池的支持,使用线程池,将很大程度提高线程调度的性能. 第三,介绍JDK的一些并发容器.这些容器专为并行访问所设计,绝对是高效.安全.稳定的实用工具. 多线程团队协作:同步控制 之前提到的synchronized是最简单的同步控制的方法.本节中,首先介绍sync…
Java多线程--JDK并发包(2) 线程池 在使用线程池后,创建线程变成了从线程池里获得空闲线程,关闭线程变成了将线程归坏给线程池. JDK有一套Executor框架,大概包括Executor.ExecutorService.AbstractExeccutorService.ThreadPoolExecutor.Executors等成员,位于java.util.concurrent包下.它们之间的关系如下: Executor是顶层的接口,ExecutorService接口继承了它,Abstrc…
Java多线程--JDK并发包(1) 之前介绍了synchronized关键字,它决定了额一个线程是否可以进入临界区:还有Object类的wait()和notify()方法,起到线程等待和唤醒作用.synchronized关键字经常和它们一起使用,因为wait和notify在调用之前需要获得"锁",而锁时依靠synchronized获得的. 同步机制 重入锁 下面是一个使用ReentrantLock的简单例子.可以看到,和synchronized相比,必须手动调用unlock()方法释…