juc

深入理解枚举类

谁都会走 提交于 2019-12-05 09:36:11
深入理解枚举 ​ 最近刚学习完JVM相关知识,想到枚举既然这么异类,那就从字节码角度来分析一下它。有关枚举的讲解,很多博客已经很详细了,这里我们就从字节码的角度重新来认识一下它。 ​ 枚举类是一种特殊的类,它可以有自己的成员变量,方法,可以实现一个或多个接口,也可也定义自己的构造器。 1. 枚举类的继承结构: 2. 枚举类和普通类的区别: (1)枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是继承Object类,因此枚举不能够显示继承其他父类(单继承局限性,但是可以实现接口)。其中“java.lang.Enum”实现了“Comparable”和“Serializable”接口。 (2)使用enum定义,非抽象的枚举类默认会使用final修饰,因此枚举类不能够派生子类。 (3)枚举类的构造器只能够使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private修饰符。 (4)枚举类的所有实例必须要在枚举类的第一行显示列出,否则这个枚举类永远都能产生实例。列出这些实时,系统会自动添加public static final修饰符,无需程序员显示添加。 (5)枚举类默认提供了一个values方法,返回枚举实例数组,该方法可以很方便的遍历所有的枚举值。

JUC - ThreadPoolExecutor

不问归期 提交于 2019-12-03 04:09:32
JUC - ThreadPoolExecutor 创建一个ThreadPoolExecutor ThreadPoolExecutor( int corePoolSize, // 保留在池中的线程数,即使空闲了也保留(除非设置了{@code allowCoreThreadTimeOut}) int maximumPoolSize, // 池中允许的最大线程数 long keepAliveTime, // 当maximumPoolSize>corePoolSize时,多余空闲线程等待任务的时间 TimeUnit unit, // {@code keepAliveTime}参数的时间单位 BlockingQueue<Runnable> workQueue, // 在task执行之前暂存task.队列只接纳被 {@code execute}方法提交的{@code Runnable}task ThreadFactory threadFactory, // 创建执行task线程的工厂 RejectedExecutionHandler handler // 如果达到线程界限或者队列容量,拒绝任务执行的处理 ) 参数限制 满足以下条件之一则抛出 IllegalArgumentException corePoolSize < 0 keepAliveTime < 0 maximumPoolSize <

为什么juc下的集合类是线程安全的的

匿名 (未验证) 提交于 2019-12-02 23:49:02
也有一些线程安全的集合,如Vector,HashTable,但大多都是基于sychronized锁控制机制,性能很低。 如果既保证线程安全,执行效率又高,就可考虑下JUC下的集合类了,如: ArrayList对应的高并发类是CopyOnWriteArrayList, HashMap对应的高并发类是ConcurrentHashMap。 它们鱼与熊掌可兼得。但它们为什么在保证效率的同时还能保证线程安全呢? 那么我们先来看看CopyOnWriteArrayList。 CopyOnWriteArrayList提供高效地读取操作,使用在读多写少的场景。CopyOnWriteArrayList读取操作不用加锁,且是安全的; 写操作时,先copy一份原有数据数组,再对复制数据进行写入操作,最后将复制数据替换原有数据,从而保证写操作不影响读操作。 同时注意:其copy的整个过程是上了锁的,所以不会产生多线程安全问题。 我们来看看CopyOnWriteArrayList的核心的源码: /** * Appends the specified element to the end of this list. * * @param e element to be appended to this list * @return {@code true} (as specified by {@link

JUC简介

匿名 (未验证) 提交于 2019-12-02 23:47:01
JUCʲô java.util.concurrent包的简称,目的就是为了更好的支持高并发任务, 让开发者利用这个包进行的多线程编程时可以有效的减少竞争条件和死锁线程。 JUC的结构 juc下有很多类,但是我们可以将这些类分为下图中五类: 1,tools(工具类):又叫信号量三组工具类,包含有 2,executor(执行者):是Java里面线程池的顶级接口,但它只是一个执行线程的工具,真正的线程池接口是ExecutorService,里面包含的类有: 3,atomic(原子性包):是JDK提供的一组原子操作类, value ,而且被 volatile 关键字修饰了。 5,collections(集合类):主要是提供线程安全的集合,

Java多线程实现和JUC介绍

匿名 (未验证) 提交于 2019-12-02 21:52:03
继承父类Thread,重写run()方法 【实现】 class MyThreadEx extends Thread{ private String title; MyThreadEx(String title){ this.title = title; } @Override public void run() { for (int i = 0;i < 10;i++){ System.out.println(currentThread().getName()+"--"+title+":"+i); } } } 【调用】 MyThreadEx thread = new MyThreadEx("A"); thread.start(); 实现接口(Runnable)实现接口方法run() 【实现】 class MyThread implements Runnable{ private int i = 0; @Override public void run() { for (;i < 10;i++) System.out.println(Thread.currentThread().getName()+":"+i); } } 【调用】 MyThread runthread = new MyThread(); new Thread(runthread,"A").start(); 实现接口

JUC并发包基本使用

╄→гoц情女王★ 提交于 2019-12-01 19:19:14
一、简介   传统的Java多线程开发中,wait、notify、synchronized等如果不注意使用的话,很容易引起死锁、脏读问题。Java1.5 版本开始增加 java.util.concurrent 并发编程包,简化了多线程开发难度。添加了很多的多线程操作工具类,可根据实际需求去选择使用。   JUC 常用工具类:   Semaphore - 信号量   ReentrantLock - 可重入锁。之前有做过简介使用,详见 https://www.cnblogs.com/eric-fang/p/8991208.html   ReadWriteLock - 读写锁   BlockingQueue - 阻塞队列。详见 https://www.cnblogs.com/eric-fang/p/8989860.html   CountDownLatch - 计数器。在计数器归零后,允许之前阻塞的若干线程继续执行   CyclicBarrier - 栅栏。在某一条件达成之前,所有线程均阻塞等待   AtomicXXXXXXX - 原子操作类,常见的有:AtomicInteger、AtomicLong、AtomicBoolean。   TimeUnit - 时间枚举类,提供一些时间的便捷操作   Executor、ExecutorService、Future : 之前有做过简介使用,详见

【JUC】3.ReentrantLock

二次信任 提交于 2019-12-01 05:10:48
【JUC】3.ReentrantLock ReentrantLock实2477203708现Lock接口,所以先看下Lock接口: public interface Lock { // 获得锁 void lock(); // 获得锁 void unlock(); // lock非阻塞版本,成功返回true boolean tryLock(); // 添加尝试时间,时间到返回false boolean tryLock(long time, TimeUnit unit) // 返回一个监视器对象 Condition newCondition(); } 再来看ReentrantLock的常用API: public class ReentrantLock implements Lock,Serializable { // 构造器,可以实现公平锁 public ReentrantLock() public ReentrantLock(boolean fair) public void lock() // 可中断锁 public void lockInterruptibly() // 可轮询的锁获取,有返回值。获取成功返回true;获取失败,返回false,线程不会阻塞、 public boolean tryLock() public boolean tryLock(long timeout,

【JUC】5.线程池—Executor

青春壹個敷衍的年華 提交于 2019-12-01 04:32:19
创建线程池可以分为三种方式: 1. 通过ThreadPoolExecutor的构造方法,创建ThreadPoolExecutor的对象,即一个线程池对象; 此构造方法,一共7个参数,5个必须参数,2个带有默认值的参数;详细后面说; 传送: https://www.cnblogs.com/mussessein/p/11654022.html 2. 通过Executors返回的线程池对象; 这种方法创建的常用线程池为4种,还可以创建ForkJoinPool对象; 可以说是封装好的方法,通过Executors的4种常用静态方法,返回4种已经封装好的ThreadPoolExecutor线程池对象; 传送: https://www.cnblogs.com/mussessein/p/11654120.html 3. ForkJoinPool并发框架 将一个大任务拆分成多个小任务后,使用 fork 可以将小任务分发给其他线程同时处理,使用 join 可以将多个线程处理的结果进行汇总;这实际上就是分治思想。 Executor类(尽量不使用此方法,而是使用ThreadPoolExecutor类) Executors 返回的线程池对象的弊端如下: FixedThreadPool 和 SingleThreadPool : 允许的请求队列长度为 Integer.MAX_VALUE ,可能会堆积大量的请求

【JUC】5.线程池—ThreadPoolExecutor

Deadly 提交于 2019-12-01 04:30:35
创建线程池可以分为三种方式: 1. 通过ThreadPoolExecutor的构造方法,创建ThreadPoolExecutor的对象,即一个线程池对象; 此构造方法,一共7个参数,5个必须参数,2个带有默认值的参数;详细后面说; 2. 通过Executors返回的线程池对象; 这种方法创建的常用线程池为4种,还可以创建ForkJoinPool对象; 可以说是封装好的方法,通过Executors的4种常用静态方法,返回4种已经封装好的ThreadPoolExecutor线程池对象; 3. ForkJoinPool并发框架 将一个大任务拆分成多个小任务后,使用 fork 可以将小任务分发给其他线程同时处理,使用 join 可以将多个线程处理的结果进行汇总;这实际上就是分治思想。 后面再说此类; 为什么要使用线程池: 使用线程池的好处 降低资源消耗。重复利用已创建线程,降低线程创建与销毁的资源消耗。 提高响应效率。任务到达时,不需等待创建线程就能立即执行。 提高线程可管理性。 防止服务器过载。内存溢出、CPU耗尽。 进入正题: ThreadPoolExecutor 尽量使用此类创建线程池,而非Executors创建;使用此方法,更明确线程池的运行规则,规避资源耗尽的风险 先说一下线程池的流程: 线程先进入核心池运行; 核心池满了,进队列等待; 队列满了,就创建新线程,直到最大线程数满了

JUC五种常见同步工具类总结

两盒软妹~` 提交于 2019-12-01 02:21:34
JUC常用工具类 Semaphore CountDownLatch CyclicBarrier Exchanger Phaser 使用场景 这五种同步辅助类适用于的同步场景: 1、Semaphore 信号量是一类经典的同步工具。信号量通常用来限制线程可以同时访问的(物理或逻辑)资源数量。 2、CountDownLatch 一种非常简单、但很常用的同步辅助类。其作用是在完成一组正在其他线程中执行的操作之前,允许一个或多个线程一直阻塞。 3、CyclicBarrier 一种可重置的多路同步点,在某些并发编程场景很有用。它允许一组线程互相等待,直到到达某个公共的屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier在释放等待线程后可以重用,所以称它为循环的barrier。 4、Phaser一种可重用的同步屏障,功能上类似于CyclicBarrier和CountDownLatch,但使用上更为灵活。非常适用于在多线程环境下同步协调分阶段计算任务(Fork/Join框架中的子任务之间需同步时,优先使用Phaser) 5、Exchanger允许两个线程在某个汇合点交换对象,在某些管道设计时比较有用。Exchanger提供了一个同步点,在这个同步点,一对线程可以交换数据