
JAVA
饶艳辉
十年以上程序员老兵,关注技术交流、提倡原创、拥抱开源。专注服务端、数据结构、算法、互联网微服务、分布式、高可用等架构领域!!!
展开
-
深入浅出设计模式:建造者模式
设计模式是程序员必须掌握的技能,熟练应用各种设计模式,不仅可以提升我们的编码能力,也可以使得我们的编码更美观。在这里我们来讲解一下建造者模式。百度百科定义如下建造者模式(Builder Pattern)是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。实用范围1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。...原创 2019-11-10 20:21:30 · 252 阅读 · 0 评论 -
深入浅出设计模式:模板模式
设计模式是程序员必须掌握的技能,熟练应用各种设计模式,不仅可以提升我们的编码能力,也可以使得我们的编码更美观。在这里我们来讲解一下模板模式。模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。优点:1、封装不变部分,扩展可变部分。 2、提取公共代码,...原创 2019-11-04 23:04:38 · 238 阅读 · 0 评论 -
JAVA多线程高并发之ReentrantLock讲解公平锁
JAVA中多线程高并发场景下保证线程安全通常都会考虑加锁。但是在特殊场景下我们也可以采用java.util.concurrent包提供的线程安全的对象,避免加锁从而达到高效的目的。但是,这些线程安全的对象仅仅指的是针对于原子性操作是线程安全的,如果多个方法同时调用无法保证线程安全,只能考虑加锁。这里我们举个列子:假设我们在多线程高并发场景下使用java.util.concurrent.Conc...原创 2019-08-10 18:23:34 · 345 阅读 · 1 评论 -
JAVA手写一个多线程死锁
大家都知道多线程并发的时候,我们一般会用到锁。但是锁用不好,就会导致死锁。那么,死锁是如何产生的呢?一般造成死锁必须同时满足如下4个条件:互斥条件:线程使用的资源必须至少有一个是不能共享的。 请求与保持条件:至少有一个线程必须持有一个资源并且正在等待获取一个当前被其他线程持有的资源。 非剥夺条件:分配的资源不能从相应的线程中被强制剥夺。 循环等待条件:第一个线程等待其他线程,后者又在...原创 2019-08-11 17:28:28 · 894 阅读 · 0 评论 -
JAVA并发编程Fork/Join(分而治之思想)之(Future/Callable)
Java提供Fork/Join框架用于并行执行任务,它的思想就是讲一个大任务分割成若干小任务,最终汇总每个小任务的结果从而得到这个大任务的结果。这里我们也借助这种思想来处理一个超大任务的运算,但是不用ForkJoinPool/ForkJoinTask这种方式,而采用ExecutorService/Future/Callable方式。我们来看一段ExecutorService/Future/...原创 2019-08-11 17:35:15 · 713 阅读 · 0 评论 -
JAVA并发编程Fork/Join(分而治之思想)之(ForkJoinPool/ForkJoinTask)
Java提供Fork/Join框架用于并行执行任务,它的思想就是讲一个大任务分割成若干小任务,最终汇总每个小任务的结果从而得到这个大任务的结果。这里我们也借助这种思想来处理一个超大任务的运算,采用ForkJoinPool/ForkJoinTask这种方式。我们来看一段ForkJoinPool/ForkJoinTask方式实现的代码package com.forkjoin;impo...原创 2019-08-11 17:40:39 · 341 阅读 · 0 评论 -
ConcurrentHashMap弱一致性迭代器
什么是弱一致性迭代器???当创建迭代器后,其他线程删除了该元素时候并不会抛出java.util.ConcurrentModificationException异常,能够保持创建迭代器后的元素被正确的Iterator.next()出来。例如ConcurrentHashMap就是弱一致性迭代器,HashMap就是强一致性迭代器。通过下面代码部分,我们可以更好的理解弱一致性和强一致性迭代器。...原创 2019-08-25 21:40:44 · 1116 阅读 · 1 评论 -
JAVA并发编程下保证车票出售线程安全之synchronized锁
在并发编程场景下如何保证车票或者商品出售业务是线程安全的?首先我们就会想到加锁,来保证出售业务线程安全。但是加锁势必会带来性能上的瓶颈。那么我们就会思考,还有没有其它的方式避免加锁来实现同样的效果呢?这里我们带着这个问题,先采用常见的加锁方式来实现。package com.sync.ticket;import java.util.ArrayList;import java.ut...原创 2019-08-12 22:02:34 · 229 阅读 · 0 评论 -
JAVA并发编程下保证车票出售线程安全之ConcurrentLinkedQueue
在并发编程场景下如何保证车票或者商品出售业务是线程安全的?首先我们就会想到加锁,来保证出售业务线程安全。但是加锁势必会带来性能上的瓶颈。那么我们就会思考,还有没有其它的方式避免加锁来实现同样的效果呢?这里我们就采用ConcurrentLinkedQueue方式避免加锁来实现。package com.sync.ticket;import java.util.Queue;impor...原创 2019-08-12 22:08:28 · 238 阅读 · 0 评论 -
详解JAVA选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。选择排序时间复杂度为O(n²),具体关于时间复杂度的推理大家可以去看百度百科!!! ...原创 2019-08-16 23:44:25 · 191 阅读 · 0 评论 -
详解JAVA插入排序
插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n²)。是稳定的排序方法。插入排序...原创 2019-08-17 22:46:42 · 256 阅读 · 0 评论 -
总览十大经典排序算法
排序算法是《数据结构与算法》中最基本的算法之一,排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。十大经典排序算法分别是:1、冒泡排序 2、选择排序 3、插入排序 4、希尔排序 5、归并排序 6、快速排序 7、堆排序 8、计数排序 9、桶排序 10、基数排序用一张图...原创 2019-08-17 22:52:24 · 258 阅读 · 0 评论 -
CopyOnWriteArrayList源码分析、使用场景说明
java.util.concurrent包下提供了很多并发编程使用的类,CopyOnWriteArrayList就是其中之一。CopyOnWriteArrayList是线程安全容器(相对于ArrayList),底层通过复制数组的方式来实现。CopyOnWriteArrayList在遍历的使用不会抛出ConcurrentModificationException异常,并且遍历的时候就不用额外加锁...原创 2019-08-26 07:01:16 · 705 阅读 · 0 评论 -
为什么重写equals方法同时需要重写hashCode方法?
为什么重写equals方法同时需要重写hashCode方法?众所周知equals()和hashCode()是Object类中定义的方法。Object类定义的方法如下:Object的equals()定义如下:注释部分大概意思是:请注意,每当重写此方法时,通常需要重写哈希代码,其中规定相等的对象必须具有相等的哈希代码。Object的hashCode()定义如下:以上...原创 2019-08-30 00:43:03 · 4266 阅读 · 3 评论 -
并发编程之LockSupport源码分析及简单使用
曾经面试被问到JAVA中实现线程挂起和唤醒有哪些方式,除了采用Object类中wait notify/notifyAll实现还有其他方式吗?当时真心没答上来,后来做了功课才知道还有LockSupport类中park/unpark可以实现。大家如果了解AQS(全称AbstractQueuedSynchronizer),就知道并发编程中很多类都是基于AQS实现的,例如ReentrantLock、 ...原创 2019-08-31 06:20:19 · 404 阅读 · 0 评论 -
Thread线程有哪几种状态,这篇文章带你深入了解!
Thread线程有哪几种状态,这也是面试中很多小伙伴都会被问到的知识点。Thread线程状态是应该掌握的基础知识。但是很多小伙伴如果没有总结过的话,面试过程可能会懵圈,这里我稍作整理,希望小伙伴们可以查漏补缺。Thread源码中有定义State的枚举类,State枚举类中有明确定义线程的状态。源码如下。public enum State { /** * ...原创 2019-08-31 19:14:07 · 1733 阅读 · 0 评论 -
JAVA多线程高并发之ReentrantLock讲解lockInterruptibly方法
JAVA中多线程高并发场景下保证线程安全通常都会考虑加锁。但是在特殊场景下我们也可以采用java.util.concurrent包提供的线程安全的对象,避免加锁从而达到高效的目的。但是,这些线程安全的对象仅仅指的是针对于原子性操作是线程安全的,如果多个方法同时调用无法保证线程安全,只能考虑加锁。这里我们举个列子:假设我们在多线程高并发场景下使用java.util.concurrent.Conc...原创 2019-08-10 18:15:25 · 1373 阅读 · 0 评论 -
JAVA多线程高并发之ReentrantLock讲解lock/unlock/tryLock方法
JAVA中多线程高并发场景下保证线程安全通常都会考虑加锁。但是在特殊场景下我们也可以采用java.util.concurrent包提供的线程安全的对象,避免加锁从而达到高效的目的。但是,这些线程安全的对象仅仅指的是针对于原子性操作是线程安全的,如果多个方法同时调用无法保证线程安全,只能考虑加锁。这里我们举个列子:假设我们在多线程高并发场景下使用java.util.concurrent.Conc...原创 2019-08-10 18:05:58 · 2940 阅读 · 0 评论 -
面试锦集:JAVA算法面试第四篇
package com.algorithm;/** * 面试锦集: * 要求不使用JDK自带的API,手动实现剔除某字符串中所有空格 * * @author 小辉哥/小辉GE * <p> * 2019年8月2日 下午17:19:38 */public class StringTrims { public static void main(String[...原创 2019-08-02 17:37:49 · 132 阅读 · 0 评论 -
面试锦集:JAVA算法面试第三篇
package com.algorithm;/** * 面试锦集: * * JAVA程序实现一天24小时时分秒重合次数 * * @author 小辉GE/小辉哥 * * 2019年8月1日 下午6:02:40 */public class HourMinuteSecondRepeatTimes { public static void main(String[] ...原创 2019-08-01 18:39:10 · 175 阅读 · 0 评论 -
面试锦集:JAVA算法面试第一篇
package com.algorithm;/** * 面试锦集: * * 实现方法int findNextPrime(int i),使其返回下一个大于i的质数。 * * 百度百科对质数的定义:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。 * * @author 小辉GE/小辉哥 * * 2019年7月31日 下午6:20:00 */p...原创 2019-07-31 22:31:43 · 208 阅读 · 0 评论 -
面试锦集:JAVA算法面试第二篇
package com.algorithm;/** * 面试锦集: * * 用最简单的方法把数组第一位和第二位, 第二位和第三位, * 第三位和第四位, 第四位和第五位,第五位和第六位, * 最后一位和第一位更换位置(要求单层循环实现) * * @author 小辉GE * * 2019年7月30日 下午6:19:00 */public class ArrayCh...原创 2019-07-31 22:42:31 · 146 阅读 · 0 评论 -
JAVA子父类代码块输出顺序
子父类代码块输出顺序,资深程序员都会犯的错误。当然也是面试的时候一些公司会出的面试题,我想可能就是知道大多数程序员都会犯错,如果符合应聘要求后期用了压工资的吧,个人觉得出这样的面试题的企业我也是醉了!!!这里整理出来和大家一起学习。package com.algorithm;/** * 面试锦集: * 子父类代码块输出顺序(资深程序员都会犯的错误) * * @author 小辉哥...原创 2019-08-04 11:16:40 · 421 阅读 · 0 评论 -
Thread启动线程有哪些方法、区别?
大家都知道JAVA中开启线程最基础的方法有三种。分别是继承Thread类、实现Runnable接口、实现Callable接口,然后分别实现对应的方法,这里不过多描述。那么如果采用继承Thread类方式,匿名类方式实现Runnable对应run()方法后,有几种启动线程的方式,各有什么区别?package com.algorithm;/** * 面试锦集: * Thread启动线程...原创 2019-08-04 11:40:17 · 938 阅读 · 0 评论 -
设计模式:单例模式之双检锁/双重校验锁
谈到单例模式,首先需要说明一下,单例模式(Singleton Pattern)是JAVA中最简单的设计模式之一。这种类型的设计模式属于创建型模式。保证一个类仅有一个实例,并提供一个访问它的全局访问点。要实现一个线程安全的单例模式有多种做法。常见的有懒汉式、饿汉式、双检锁/双重校验锁、静态内部类、枚举等方式。每种方式都有优缺点,并不偏向某一种创建方式。具体情况具体分析,然后采用比较好的创建方式才...原创 2019-08-08 18:48:08 · 2163 阅读 · 0 评论 -
深入浅出设计模式:单例模式之静态内部类
谈到单例模式,首先需要说明一下,单例模式(Singleton Pattern)是JAVA中最简单的设计模式之一。这种类型的设计模式属于创建型模式。保证一个类仅有一个实例,并提供一个访问它的全局访问点。要实现一个线程安全的单例模式有多种做法。常见的有懒汉式、饿汉式、双检锁/双重校验锁、静态内部类、枚举等方式。每种方式都有优缺点,并不偏向某一种创建方式。具体情况具体分析,然后采用比较好的创建方式才...原创 2019-08-08 19:24:25 · 285 阅读 · 0 评论 -
详解JAVA冒泡排序
冒泡排序可以说是常见的几种排序中相对简单的,冒泡排序时间复杂度为O(n²),具体关于时间复杂度的推理大家可以去看百度百科!!!package com.algorithm;import java.util.Arrays;/** * 面试锦集: * 冒泡排序你写得好吗? * * @author 小辉GE/小辉哥 * <p> * 2019年8月6日 下午12:30:...原创 2019-08-06 18:14:18 · 194 阅读 · 0 评论 -
JAVA二分查找/折半查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。二分查找时间复杂度为O(log2n),具体关于时间复杂度的推理大家可以去看百度百科!!!package com.algorithm;import java.util.Arrays;/** * 面试锦集: * 二分查找/折半查...原创 2019-08-06 18:26:32 · 352 阅读 · 0 评论 -
面试锦集:手写一个同步类容器之wait/notify/notifyAll实现
互联网大厂面试必考题目:手写一个同步类容器,支持多个生产者线程以及多个消费者线程的阻塞调用。采用 wait notify/notifyAll实现。我第一次去大厂面试都被难住了!!!package com.container;import java.util.LinkedList;import java.util.concurrent.TimeUnit;import java.ut...原创 2019-08-09 21:13:41 · 252 阅读 · 0 评论 -
面试锦集:手写一个同步类容器之Lock/Condition await signalAll实现
互联网大厂面试必考题目:手写一个同步类容器,支持多个生产者线程以及多个消费者线程的阻塞调用。采用 Lock/Condition await signalAll实现,更精确定位唤起的线程。我第一次去大厂面试都被难住了!!!package com.container;import java.util.LinkedList;import java.util.concurrent.Time...原创 2019-08-09 21:19:12 · 332 阅读 · 0 评论 -
面试锦集:手写一个同步类容器之BlockingQueue实现
互联网大厂面试必考题目:手写一个同步类容器,支持多个生产者线程以及多个消费者线程的阻塞调用。采用BlockingQueue实现,我第一次去大厂面试都被难住了!!!package com.container;import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue...原创 2019-08-14 13:18:58 · 641 阅读 · 0 评论 -
面试锦集:JAVA中存在i+1小于i的情况吗?
JAVA中存在i+1<i的情况吗,请代码实现并详细说明?面试中被问到这个问题,小伙伴们是不是很疑惑,此时内心是不是在想WHAT,发生了什么,这么多年的数学难道白学了。很显然在JAVA中是存在的,我们这里直接上代码。package com.algorithm;import java.util.ArrayList;import java.util.List;/** *...原创 2019-08-07 17:47:40 · 1454 阅读 · 1 评论