
Java
上古伪神
喜欢撸铁的程序员
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
设计模式之单例模式
今天来说一下同样属于创建型模式的单例模式,相信这个模式普遍都清楚,因为平时在编码的时候都会进行相应的使用,我这边就当做日志记录一下。免得以后忘了还得去搜,我发现我记忆里非常差,很多东西很快就忘记了,年纪大了没办法。一、定义保证一个类仅有一个实例,并提供全局访问点。就是打死也不会生成第二个实例。一般用在工具类上,可以降低内存消耗二、实例单例模式有几种,分别是饿汉式、懒汉式、静态内部类单例以及枚举类单例。(1)饿汉式顾名思义,饿汉式就是整个项目在启动的时候进行创建。此时可以使用静态代码块原创 2020-10-20 22:46:44 · 117 阅读 · 0 评论 -
建造者模式还能这么用
一、定义将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。类似组将一台电脑,有主机、屏幕、鼠标、键盘等,你将这些组件的型号给组装店说好,他就会根据你的需求组装电脑,但是你不会看见具体的组装过程。建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。二、实例像上面说的电脑组装实例,就有三个对象,一个是电脑,一个是组装者,一个是客户。电脑对象:public class C原创 2020-10-18 21:29:44 · 194 阅读 · 0 评论 -
【设计模式-工厂相关模式】
工厂相关模式有两种,分别是:(1)工厂方法模式(2)抽象工厂模式接下来分别说下这两种工厂模式:一、工厂方法模式(1)定义:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。其实就是专职专产,比如某条产品线就只生产一种产品。(2)实例:比如车辆厂商有保时捷、法拉利等,他们的厂就专门生产一种品牌的车,这是就会有两个抽象的对象,一个是车,一个是厂,什么厂就生产什么样的车。车对象:1、车的抽象对象public abs原创 2020-10-15 22:13:34 · 146 阅读 · 0 评论 -
CyclicBarrier原来是这样的
上一篇聊了一下Semaphore信号灯的用法及源码,这一篇来聊一下CyclicBarrier的用法及解析。官网解释:允许一组线程全部等待彼此达到共同屏障点的同步辅助。循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。屏障被称为循环,因为它可以在等待的线程被释放之后重新使用。意思就是每个线程都得执行到等待点进行等待,直到所有线程都执行到等待点,才会继续往下执行。相当于日常开会,只有等每个参会的人都到之后才会开始会议。用法:(以开会举例)1、会议需要三个人..原创 2020-10-13 22:37:06 · 103 阅读 · 0 评论 -
Semaphore最详细解析
官方解释:一个计数信号量。在概念上,信号量维持一组许可证。如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它。每个release()添加许可证,潜在地释放阻塞获取方。但是,没有使用实际的许可证对象; Semaphore只保留可用数量的计数,并相应地执行。信号量通常用于限制线程数,而不是访问某些(物理或逻辑)资源我记得考科目一的时候有一个大教室,这个教室只能同时允许两百人考试,当有一个考完之后,下一个才能进去进行考试。门口会有安检人员进行安检,这个Semaphore就相当于这个安原创 2020-10-12 21:52:32 · 1193 阅读 · 2 评论 -
CountDownLatch解析
CountDownLatch是JUC包下的一个工具类,允许一个或多个线程等待,直到其他线程中执行的一个放行操作完后,等待线程才会继续往下执行的同步辅助。可用于一个或多个线程中等待其他线程完成某项操作后再运行的场景。首先看一下其用法:1、先创建一个CountDownLatch的实例参数是计数器(可以设置大于1的),也就是必须要设定的线程执行完后等待线程才会往下执行。设置一个共享变量sharedNum,初始值为0 int sharedNum = 0;CountDownLatch coun原创 2020-10-10 22:32:15 · 176 阅读 · 0 评论 -
Java锁机制
上一篇简略说了一下Synchronized和Lock,今天就来说一下Java的锁机制。Java的锁机制主要分为四种,分别是(1)公平锁、非公平锁(2)可重入锁(3)自旋锁(4)共享锁、独占锁接下来一一说一下这四种锁一、公平锁、非公平锁(1)公平锁:指多个线程按照申请锁的顺序来获取锁,类似于日常的排队(2)非公平锁:多个线程获取锁的顺序并不是按照申请锁的顺序来,通俗来说就是插队(3)ReentrantLock默认是非公平的public ReentrantLock(原创 2020-10-09 22:56:46 · 912 阅读 · 1 评论 -
锁:Sychronized、Lock
锁是用来在多线程并发阶段保障数据同步的重要手段,防止出现脏数据,加锁代码在某个时间点只能由一个线程运行,其他线程等待。普遍熟知的锁是synchronized关键字和Lock类。一、synchronized关键字这个在同步中是最常用的,分成对象锁和类锁,可以对方法和代码块进行加锁。1、对象锁,锁住的是对象,用于synchronized(this){}synchronized(Object){}2、类锁,锁住的是该类的所有实例 synchronized(Object.class){}原创 2020-10-01 22:32:38 · 360 阅读 · 0 评论 -
Set源码解析(红黑树)
之前粗略看了一下List和Map,今咱来聊一下Set。主要看以下几个:(1)HashSet(2)Collections.synchronizedSet(3)LinkedHashSet(4)CopyOnWriteArraySet(5)TreeSet一、HashSetHashSet是日常搬砖中最常用的,如果有了解过HashMap的实现,那么HashSet你也就理解了。(1)HashSet底层就是用HashMap实现的,也就是非线程安全。private transient原创 2020-09-30 19:12:03 · 440 阅读 · 0 评论 -
Map源码解析
聊一下Map。主要有以下几个类:(1)HashMap(2)Hashtable(3)ConcurrentHashMap(4)LinkedHashMap(5)WeakHashMap环境是java8,上述hashMap和ConcurrentHashMap在java7的时候实现会有不同。Map主要是用来存储<K,V>键值对,那么现在来一个一个看一下底层是如何进行实现的。一、HashMap这是平常最常用的一个类,也是非线程安全的。都知道是数组+链表实现的,那具体是如何实原创 2020-09-29 23:00:17 · 322 阅读 · 0 评论 -
List源码解析
开始看一下集合Collection,List是Collection的一个子接口,主要是看一下其下的几个类。1、AbstractList2、ArrayList3、Collections.synchronizedList4、Vector5、LinkedList6、CopyOnWriteArrayList一、AbstractList这是一个抽象类,其是实现List接口基础类,像ArrayList、LinkedList和Vector都是继承此抽象类的。1》如果要实现一个不可变的列原创 2020-09-28 22:18:26 · 404 阅读 · 0 评论 -
JDK动态代理详解
JDK动态代理是代理模式的一种,且只能代理接口。spring也有动态代理,称为CGLib,现在主要来看一下JDK动态代理是如何实现的?一、介绍JDK动态代理是有JDK提供的工具类Proxy实现的,动态代理类是在运行时生成指定接口的代理类,每个代理实例(实现需要代理的接口)都有一个关联的调用处理程序对象,此对象实现了InvocationHandler,最终的业务逻辑是在InvocationHandler实现类的invoke方法上。也即是在invoke方法上可以实现原方法中没有的业务逻辑,相当于sp原创 2020-09-27 21:44:25 · 237 阅读 · 0 评论 -
一文学会Java操作Elasticsearch
前两篇对es的操作只是在开发或生产环境中排查问题需要大量使用,最常用的还是在代码中对es的增删改查,下面就来看一下。引入依赖:先定义一下常量:一、TransportClient对es的操作是通过TransportClient的,需要先创建TransportClient二、索引对索引的操作,是通过IndicesAdminClient进行操作的(1)增使用XContentBuilder设置索引的,也可以用Map或者直接是json字...原创 2020-09-26 15:13:39 · 341 阅读 · 0 评论 -
类加载器ClassLoader
上篇文章说到,Class类可以通过一个类的全限定名去加载类,那么底层是如何去加载的呢?这就是我们今天要聊的类加载器ClassLoader,其可以通过一个类的全限定名来获取描述此类的二进制字节流,也即是将编译过后的Class文件加载到内存中。需要注意的是,即使是同一个类,类加载器不一样,就必定不相等。例如自定义了一个类加载器跟JVM默认加载器进行比对/** *自定义类加载器 */class MyClassLoader extends ClassLoader { //类加载需要用到包名.原创 2020-09-22 22:17:54 · 381 阅读 · 0 评论 -
从Class源码看反射
日常敲码中,如果想要在程序运行阶段访问某个类的所有信息,并支持修改类的状态或者行为的话,肯定会用到反射,而反射靠的就是Class类。Java的动态代理也用到了这个东西,所以了解其基本操作在苦逼的CRUD中会添加一丝丝乐趣(有点意思)。首先来看看Class的操作有哪些?public final class Class<T> {}上述代码可知,Class是一个由final修饰的泛型类,所以并不能直接通过new Class()获取其实例。那么应该如何获取呢?//直接通过类的静态变量原创 2020-09-21 21:35:51 · 426 阅读 · 0 评论 -
Thread、ThreadLocal源码解析
今天来看一下Thread和ThreadLocal类的源码。一、Thread(1)首先看一下线程的构造方法,之后会说每种参数的用法,而所有的构造函数都会指向init方法//空构造创建一个线程Thread() //传入Runnable对象创建一个线程Thread(Runnable target) //传入Runnable对象和线程名创建一个线程Thread(Runnable target, String name) //传入线程名创建一个线程Thread(String nam.原创 2020-09-20 16:23:13 · 209 阅读 · 0 评论 -
Redis详细使用及结合SpringBoot
今天咱来聊一下Redis五种数据类型的详细用法以及在代码中如何使用。废话不多说,开始!Redis五种数据类型:string:字符串对象 list:列表对象 hash:散列 set:集合 zset:有序集合接下来一一进行操作(命令行操作,由于很多,就不一一截图了):一、统一操作(五种数据类型都拥有,针对key)我给定一个key:k1//获取所有keykeys *//删除k1DEL k1//检查给定的k1是否存在EXISTS k1//给k1设置1秒的过期时..原创 2020-09-17 22:53:54 · 435 阅读 · 0 评论 -
CAS导致的ABA问题以及解决方案
CAS算法实现一个重要前提需要取出内存中某时刻的数据,而在下时刻比较并替换,那么在这个时间差类会导致数据的变化。 上篇文章讲到CAS会出现一个ABA问题。那什么是ABA问题呢? 官方一点的解释就是:当有多个线程对一个原子类进行操作的时候,某个线程在短时间内将原子类的值A修改为B,又马上将其修改为A,此时其他线程不感知,还是会修改成功。代码案例: //线程操作资源,原子类ai的初始值为4 static AtomicInteger ai = new Atomic原创 2020-09-15 22:36:35 · 425 阅读 · 0 评论 -
详解volatile关键字和原子引用
本篇看一下Volatile关键字和原子引用。详解volatile关键字和原子引用上图就是JUC包结构,总共分成三块(1)java.util.concurrent:并发包基础类,包括阻塞队列,线程池相关类,线程安全Map等。(2)java.util.concurrent.atomic:原子引用相关类(3)java.util.concurrent.locks:线程锁相关类线程池技术在之前的讲解应该很清楚了,今天主要解析一个volatile关键字以及原子引用的相关类。这一篇文件涉及到JMM(java原创 2020-09-14 22:00:18 · 753 阅读 · 0 评论 -
JVM垃圾回收机制
JVM垃圾回收机制是java程序员必须要了解的知识,对于程序调优具有很大的帮助(同时也是大厂面试必问题)。要了解垃圾回收机制,主要从三个方面:(1)垃圾回收面向的对象是谁?(2)垃圾回收算法有哪些?(3)垃圾收集器有哪些?每个收集器有什么特点。接下来一一讲解清楚:一、垃圾回收面向的对象也就是字面意思,垃圾回收嘛,重要的是垃圾,那什么对象是垃圾呢,简单来说就是无用的或已死的对象。这样又引申出来什么对象是已死的,怎么判断对象是否已死?判断对象是否已死有两种算法和对象引用分类:(1)引用计数算法原创 2020-09-13 19:51:28 · 267 阅读 · 0 评论 -
JVM内存结构和Java内存模型
一、JVM首先看一张JVM结构图(某度找的)主要看运行时数据区,里边有方法区,堆,java虚拟机栈,本地方法栈,程序计数器。其中方法区和堆是线程共享的,也是JVM进行垃圾收集的区域,java虚拟机栈、本地方法栈和程序计数器是线程私有的。程序计数器:一块较小的内存空间,是当前线程所执行的字节码的行号指示器。此区域是唯一一个不会产生OOM的内存区域。Java虚拟机栈:每个方法在执行的时候都会创建一个栈帧,用于存放局部变量表、操作数栈、动态链接、方法出口等信息。可能会发生StackOverflowErr原创 2020-09-13 17:16:43 · 454 阅读 · 0 评论