
JavaSE
文章平均质量分 96
吴顺达
这个作者很懒,什么都没留下…
展开
-
FutureTask 源码阅读 使用Callable创建多线程
接上文线程池源码阅读线程池调用Future<?> submit(Runnable task);返回一个FutureTsk。简单使用public static void main(String[] args) throws ExecutionException, InterruptedException { FutureTask<Integer> future = new FutureTask(new MyCallable()); Thread th原创 2021-03-05 18:08:56 · 382 阅读 · 0 评论 -
Condition 源码学习
Condition 解析原创 2020-12-16 16:20:12 · 232 阅读 · 0 评论 -
可重入锁 ReentrantLock AQS 源码解析
使用范例Lock lock = new ReentrantLock();lock.lock();try { dosomething();} finally { lock.unlock();}在finally块中释放锁,目的是保证在获取到锁之后,最终能够被释放。接口结构Lock是个顶级接口,构建了锁的生态环境void lock();获取锁。如果该锁不可用,则出于线程调度目的,当前线程将被禁用,并处于休眠状态,直到获得该锁为止void lockInterru原创 2020-12-11 23:22:42 · 351 阅读 · 2 评论 -
JAVA retry 使用
简介retry不是关键字他是一个标记有点类似于goto,goto是Java中的保留字,在目前版本的Java中没有使用。retry后面跟循环,标记这个循环开始的位置。后续在continue或者break后面加retry。continue retry从这个标记的循环继续执行,不是重新开始,而是继续执行。break retry跳过这个标记的循环break retry 例子public static void main(String[] args) { retry: for原创 2020-12-07 19:00:06 · 188 阅读 · 0 评论 -
Java线程池简单使用学习
常用的五种类型线程池newFixedThreadPoolnewCachedThreadPoolnewSingleThreadExecutornewScheduledThreadPoolnewWorkStealingPoolnewFixedThreadPool定长线程池,控制线程最大并发数,超出的任务会在队列中等待。public static void main(String[] args) { ExecutorService pool = Executors.newFixedTh原创 2020-12-07 16:34:21 · 219 阅读 · 0 评论 -
延迟队列 DelayQueue 使用与源码解析
当内存中有一堆的客户信息,需要实时移除VIP到期的客户的特权时有以下做法。做法1:定时一段时间检查一遍所有的元素,如果客户的VIP到期日期小于当前,则取消客户的VIP特权。做法2:利用优先队列小顶堆的结构,将最快要过期的客户信息放置在堆顶,一个消费线程去poll堆顶元素并且处理,这样就不用去遍历全部的元素了。当日期不到时便让线程等待多长时间,当时间到时唤醒线程处理。以上做法2有现成的队列可以使用,就是接下来要说的延迟队列。DelayQueue结构是不是跟优先队列很像。DelayQueue其原创 2020-11-30 19:30:37 · 384 阅读 · 0 评论 -
PriorityQueue PriorityBlockingQueue 优先级队列与优先级阻塞队列 源码解析
试想一下,如果要在一堆数据中找出最大的或者最小的是不要进行一次遍历,时间复杂度为O(N)还能不能优化,比如O(1)的时间复杂度就能获取到。这就是这篇博客需要说的PriorityQueue优先级队列。先看结构完全二叉树:一棵有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,节点得插入永远在下一个位置。下面得紫色的那排小字就是节点的序号。那么第N个元素的左孩子queue [2 * n + 1]右孩子就是queue [2 *(n + 1)]。看到源码就会发现PriorityQueue存储原创 2020-11-26 17:32:25 · 641 阅读 · 0 评论 -
BlockingQueue 的使用与源码阅读
结构其中数组是循环使用的,真实中不存在从3到1的指针,使用的是putIndex,takeIndex两个下标索引。当此时存放的元素putIndex等于数组的长度-1时,putIndex下次就会变成0,又从头开始存放元素。takeIndex原理一样。基于数组实现的,并且内部持有一把ReentrantLock(读写一把)。ArrayBlockingQueue的使用简单说一下情况,后面从方法中分析。生产线程将元素放入队列中时需要先获取锁,获取到锁后向队列存放元素。消费线程获取队列中元素时也需要先获取锁,原创 2020-11-25 19:04:13 · 155 阅读 · 0 评论 -
数组 List 去除重复数据 多种实现及性能分析
有序的情况下去重单指针法:前者与后者比01、使用两个for循环实现List去重(有序)双层针法:02、使用List集合contains方法循环遍历(有序)双层针法:contains方法调用indexof方法,内部实现还是循环遍历03、使用HashSet实现List去重(无序)04、使用TreeSet实现List去重(有序)05、使用java8新特性stream实现List去重(有序)桶排序法:...原创 2020-11-22 15:01:28 · 442 阅读 · 0 评论 -
万字长文 图文阅读 JDK8 ConcurrentHashMap源码 带你吊打面试官
ConcurrentHashMap结构数组+链表+红黑树。链表大于8转红黑树,红黑树节点数小于6退回链表。跟HashMap是一样的。只是支持并发的操作存放的key-value的Node节点。结构几乎一样,但是有个很重要的地方,val,next都被volatile,保证在多个线程之间的可见性。static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key原创 2020-11-21 23:19:01 · 1576 阅读 · 7 评论 -
LinkedHashMap源码阅读
LinkedHashMap源码阅读原创 2020-11-13 23:36:24 · 157 阅读 · 0 评论 -
Iterator简介 LinkedList使用迭代器优化移除批量元素原理
public interface Iterator<E> { /** *是否还有下一个元素 */ boolean hasNext(); /** *下一个元素 */ E next(); /** * 从集合中删除最后一个返回的元素 */ default void remove() { throw new UnsupportedOperationException("remove原创 2020-11-12 20:12:16 · 700 阅读 · 0 评论 -
Consumer接口
Consumer接口@FunctionalInterfacepublic interface Consumer<T> { /** * 对给定参数执行消费操作。 */ void accept(T t); /** * 如果一个方法的参数和返回值全都是 Consumer 类型, * 那么首先做一个操作, 然后再做一个操作。来完成一个链式操作 */ default Consumer<T> andThen原创 2020-11-11 23:36:59 · 240 阅读 · 0 评论 -
LinkedList 一篇就够
创建List<Integer> list = new LinkedList<>();结构 双向链表继承关系public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, SerializableSerializable接口中内容是空的,是一个标志接口,一个类只有实现了Ser原创 2020-11-11 21:48:21 · 175 阅读 · 0 评论 -
ArrayList 一篇就够
平常开发中以下语句可能是最经常写的语句之一List<Integer> list = new ArrayList<>();继承关系public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.SerializableArrayList顶层接口是Collection,List,RandomAcce原创 2020-11-11 17:20:18 · 259 阅读 · 1 评论 -
别再问HashMap原理和扩容机制了 一篇彻底搞定HashMap源码
核心方法Node<K,V>[] resize()第一次初始化时候调用存放的键值对的数量大于第三种:HashMap不是第一次扩容。如果HashMap已经扩容过的话,那么每次table的容量以及threshold量为原有的两倍。原创 2020-11-10 14:24:11 · 600 阅读 · 1 评论 -
java 线程的状态
线程的状态NEW:初始状态,线程被构建,但是未调用start()方法。RUNABLE:运行状态,操作系统中的“就绪”,“运行”BLOCKED:阻塞状态是指线程因为某种原因放弃了cpu 使用权,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得时间片运行。阻塞的情况分三种:(一). 等待阻塞:线程调用object.wait()方法后,线程状态由RUNNING变为W...原创 2019-11-05 23:03:25 · 191 阅读 · 0 评论 -
单例设计设计模式 双重检查锁定
在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销,只有在使用这些对象时才进行初始化。比如,下面是非线程安全的延迟初始化对象的示例代码。public static Instance getInstance() { if (instance == null) {// 1:A线程执行 instance = new Instanc...原创 2019-11-04 21:44:39 · 236 阅读 · 0 评论 -
volatile关键字 可见性 有序性 原子性 内存语义
理解volatile特性的一个好方法是把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步class VolatileFeaturesExample { volatile long vl = 0L; // 使用volatile声明64位的long型变量 public void set(long l) {...原创 2020-12-09 22:51:03 · 284 阅读 · 0 评论 -
java <? extends T>
<? extends T> 和 <? super T> 是Java泛型中的"通配符" 和 “边界(Bounds)”的概念<? extends T> 是指 “上界通配符1.为什么要去使用通配符或者边界的概念使用泛型的过程中比如 我们有Fruit类,和它的派生类Apple类。class Fruit {}class Apple extends Fruit...原创 2019-10-02 20:07:57 · 1603 阅读 · 0 评论 -
Java 子类构造方法调用父类的构造方法
在构造子类时。子类创建完,即拥有父类的属性,所以在构造子类之前一定会构造父类。其实子类的所有构造方法的第一行都有一条隐示super()或者显示的super()隐示super()先说一下什么情况下会有隐示的super()。1.子类构造函数中没写super()并且子父类具有无参构造函数。那么子类第一行便会自动一条隐身的语句super父类代码:具有无参构造函数public class F...原创 2019-10-02 19:10:12 · 6200 阅读 · 0 评论 -
Java8中 Default关键字的用法 接口实现方法体
Default关键字介绍Default方法是在java8中引入的关键字。也可称为Virtual extension methods——虚拟扩展方法。使得在接口中可以包含方法体,这打破了Java之前版本对接口的语法限制,从而使得接口在进行扩展的时候,不会破坏与接口相关的实现类代码。Default好处原先接口的缺陷是,修改接口后,则需要修改全部实现该接口的类,所以引进的默认方法。他们的目的是为了...原创 2019-10-02 17:58:13 · 1171 阅读 · 0 评论 -
Java List的remove()方法陷阱以及性能优化
Java List在进行remove()方法是通常容易踩坑,主要有一下几点循环时:问题在于,删除某个元素后,因为删除元素后,后面的元素都往前移动了一位,而你的索引+1,所以实际访问的元素相对于删除的元素中间间隔了一位。使用for循环不进行额外处理时(错误)//错误的方法for(int i=0;i<list.size();i++) { if(list.get(i)%2==0) {...原创 2019-05-25 17:55:02 · 34172 阅读 · 17 评论 -
浅谈Java对象内存管理
Java对象内存管理分为三块分别为 堆内存 栈 方法区JVM提供为java程序提供并且管理所需的空间- 堆专门存储用new关键字创建的对象Student s = new Student();//new一个对象对象new Student()创建的对象位于堆内,其成员变量也位于堆中。成员变量的生命周期s=null;System.gc();//让垃圾回收器快些回收对象被创...原创 2019-03-17 22:49:23 · 421 阅读 · 0 评论 -
浅谈 Java中final的使用
final 通常指“无法改变的”final一般存在下列用法:final 数据:1.一个永不改变的编译时常量 ;2.一个在运行时被初始化的值,而不希望它被改变final引用 :final使引用恒定不变,一旦引用被初始化指向一个对象,则无法把他更改指向另一个对象。然而对象自身是可 以被修改的空白final :被声明为final,但是又未被初始化。final 参数:意味着你无法在方...原创 2019-03-11 14:12:04 · 440 阅读 · 1 评论