自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 JVM垃圾收集相关概念

垃圾收集器Serial串行收集器serial串行收集器是最基本、历史最长的收集器。特点:新生代收集器,单线程收集器,在执行GC过程时,会暂定所有用户线程,GC完成之后其他用户线程才能继续执行。缺点:执行GC过程暂定所有用户线程,如果内存大,垃圾多,GC时间过长,导致系统长时间没有反应,用户体验不好。适用情况:单cpu情况下,没有线程交互开销,适用于Client模式,如桌面应用场景,分配给虚拟机的内存不会很大,几十到几百兆之间,内存不大时,回收速度会快。ParNew收集器将GC线程由单线程变为

2020-08-27 08:59:12 138

原创 Web事件监听器接口

Web应用生命周期ServletContextListener监听 ServletContext 对象的生命周期,就是监听 Web 应用的生命周期。当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由ServletContextListener 来处理。在 ServletContextListener 接口中定义了处理ServletContextEvent 事件的两个方法。/** * 当Servlet 容器启动Web 应用时调用该方法。在调用

2020-08-05 19:35:27 366

原创 几种数据库连接池配置方式

dbcp<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName"> <value>oracle.jdbc.driver.OracleDriver</value> </property>

2020-07-27 08:57:17 158

原创 java中的动态代理

JDK动态代理示例(一个简单的动态代理)package com.lnjecit.proxy.dynamic.jdk;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * JDKDynamicProxy * jdkd动态代理 * * @author * @create 2018-03-29 16:17 **/pu

2020-07-23 19:30:34 104

原创 java异常类体系说明

类框架图主要类说明ErrorError是Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题。大多数这样的错误都是异常条件。虽然 ThreadDeath 错误是一个“正规”的条件,但它也是 Error 的子类,因为大多数应用程序都不应该试图捕获它。在执行该方法期间,无需在其 throws 子句中声明可能抛出但是未能捕获的 Error的任何子类,因为这些错误可能是再也不会发生的异常条件。一般为底层的不可恢复的类。ExceptionException类及其子类是 Throw

2020-07-23 19:04:40 139

原创 java注解的基本概念

注解的定义用@interface表示。元注解@interface上面按需要注解上一些东西,包括@Retention、@Target、@Document、@Inherited四种。注解的保留策略@Retention(RetentionPolicy.SOURCE) // 注解仅存在于源码中,在class字节码文件中不包含@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得@Retention(Re

2020-07-22 19:50:34 110

原创 java中的各种引用说明

强引用(StrongReference)强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。软引用(SoftReference)如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。如:My

2020-07-22 19:19:09 147

原创 java的拆箱和装箱

概念装箱就是 自动将基本数据类型转换为包装器类型;拆箱就是 自动将包装器类型转换为基本数据类型。装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的。(xxx代表对应的基本数据类型)。示例public class Main { public static void main(String[] args) { Integer a = 1; Integer b = 2; Integer c = 3; Integ

2020-07-22 19:04:04 94

原创 java代码的执行顺序

类加载顺序1、类属性2、静态块3、main函数对象实例化顺序1、对象属性2、非静态块3、构造函数示例class A { public A() { System.out.println("A的构造方法"); } public static int j = print(); public static int print() { System.out.println("A print"); return 521; }}public clas

2020-07-22 18:57:04 71

原创 多态的说明

多态定义所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也

2020-07-22 18:55:08 97

原创 Map相关的基础知识

HashMap原理图主要源码解析基于1.6public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Objec

2020-07-22 09:21:30 103

原创 LindedList相关介绍

ArrayList和LinkedList的区别ArrayList实现了List接口,以数组的方式来实现的,因此对于快速的随机取得对象的需求,使用ArrayList实现执行效率上会比较好。LinkedList是采用链表的方式来实现List接口的,因此在进行insert和remove动作时效率要比ArrayList高。适合用来实现Stack(堆栈)与Queue(队列)。内部结构图遍历性能最简便的ForEach循环并没有很好的性能表现,综合性能不如普通的迭代器,而是用for循环通过随机访问遍历列表时

2020-07-09 09:14:32 128

原创 java AIO的一些基本概念

主要对象AsynchronousChannelGroup异步channel的分组管理,目的是为了资源共享。一个AsynchronousChannelGroup绑定一个线程池,这个线程池执行两个任务:处理IO事件和派发CompletionHandler。AsynchronousServerSocketChannel创建的时候可以传入一个AsynchronousChannelGroup,那么通过AsynchronousServerSocketChannel创建的AsynchronousSocketChann

2020-07-06 09:26:25 159

原创 NIO的主要对象Buffer、Channel、Selector

BufferBuffer是一个对象,包含一些要写入或者读出的数据。在NIO库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的;在写入数据时,也是写入到缓冲区中。任何时候访问NIO中的数据,都是通过缓冲区进行操作。缓冲区实际上是一个数组,并提供了对数据结构化访问以及维护读写位置等信息。具体的缓存区有这些:ByteBuffe、CharBuffer、 ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer。他们实现了相同的接口:B

2020-07-02 09:25:38 281

原创 java线程池示例

服务端import org.junit.Test;import java.io.*;import java.net.ServerSocket;import java.net.Socket;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.atomic.AtomicInteger;public class TestTcpSe

2020-07-01 09:21:14 83

原创 BIO、NIO、AIO基本概念

BIO采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接,它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成后,通过输出流返回应答给客户端,线程销毁。BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程来处理这条链路,在需要满足高性能、高并发的场景是没法应用的(大量创建新的线程会严重影响服务器性能,甚至罢工)。为了改进这种一连接一线程的模型,我们可以使用线程池来管理这些线程。但是,正因为限制了线程数量,如果发生大量并

2020-07-01 09:08:00 147

原创 java对象序列化

定义当一个类实现了Serializable接口(该接口仅为标记接口,不包含任何方法定义),表示该类可以序列化。序列化的目的是将一个实现了Serializable接口的对象转换成一个字节序列,可以把该字节序列保存起来(例如:保存在一个文件里),以后可以随时将该字节序列恢复为原来的对象。甚至可以将该字节序列放到其他计算机上或者通过网络传输到其他计算机上恢复,只要该计算机平台存在相应的类就可以正常恢复为原来的对象。实现方法要序列化一个对象,先要创建某些OutputStream对象,然后将其封装在一个Obje

2020-06-30 09:17:53 92

原创 同步与堵塞

同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。而阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。所以,IO操作可以分为3类:同步阻塞(即早期的IO操作)、同步非阻塞(NI

2020-06-30 09:12:57 132

原创 ElasticSearch的常用搜索方法

单个条件from,size可省略,size默认10curl 'localhost:9200/accounts/person/_search' -d '{ "query": { "match": { "desc": "管理" } }, "from": 0, "size": 10, "sort": [ { "order_no": "asc" } ]}'多个条件各个条件之间为and关系curl 'localhost:9200/accounts/person

2020-06-28 10:09:45 198

原创 UNIX的IO模型

阻塞式I/O模型阻塞I/O(blocking I/O)模型,进程调用recvfrom,其系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者发生错误才返回。进程从调用recvfrom开始到它返回的整段时间内是被阻塞的。非阻塞式I/O模型当一个应用进程像这样对一个非阻塞描述字循环调用recvfrom时,我们称之为轮询(polling)。应用进程持续轮询内核,以查看某个操作是否就绪。I/O多路复用(事件驱动)模型信号驱动式I/O(SIGIO)异步I/O模型I/O模型的比较根据上述5种

2020-06-28 09:18:27 99

原创 AQS:AbstractQueuedSynchronizer

概念它维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)。state的访问方式有三种:getState()setState()compareAndSetState()AQS定义两种资源共享方式:Exclusive(独占,只有一个线程能执行,如ReentrantLock)和Share(共享,多个线程可同时执行,如Semaphore/CountDownLatch)。自定义同步器实现时主要实现以下几种方法isHeldExc

2020-06-24 11:15:22 80

原创 Semaphore(信号量)

概念Semaphore是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。代码示例package com.cd.concurrent.semaphore;import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.Semaphore;public class SemaphoreService {

2020-06-24 11:04:41 76

原创 ReentrantReadWriteLock(读写锁)

概念ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁。读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。所有读写锁的实现必须确保写操作对读操作的内存影响。换句话说,一个获得了读锁的线程必须能看到前一个释放的写锁所更新的内容。读写锁比互斥锁允许对于共享数据更大程度的并发。每次只能有一个写线程,但是同时可以有多个线程并发地读数据。ReadWriteLock适用于读多写少的并发情况。特性1)支持公平和非公平的获取锁的方式;2)支持可重入。读线程在获取了读锁后还可以获取读锁;写线

2020-06-24 11:00:54 166

原创 ReentrantLock和synchronized的比较

synchronized的问题无法中断一个正在等候获得锁的线程,也无法通过投票得到锁。synchronized的好处当 JVM 用 synchronized 管理锁定请求和释放时,JVM 在生成线程转储时能够包括锁定信息。这些对调试非常有价值,因为它们能标识死锁或者其他异常行为的来源。ReentrantLock和synchronized区别条件变量(Condition)对于指定的 Lock ,可以有不止一个条件变量与它关联定时锁等候tryLock()tryLock(long timeou

2020-06-24 10:52:38 78

原创 CyclicBarrier(同步屏障)

概念CyclicBarrier是一个同步工具类,它允许一组线程互相等待,直到到达某个公共屏障点。与CountDownLatch不同的是该barrier在释放等待线程后可以重用,所以称它为循环(Cyclic)的屏障(Barrier)。代码示例如果一个寝室四个人约好了去球场打球,由于四个人准备工作不同,所以约好在楼下集合,并且四个人集合好之后一起出发去球场。package concurrent;import java.util.concurrent.CyclicBarrier;import java

2020-06-24 10:42:18 161

原创 CountDownLatch(计数器)

概念CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。代码示例public class Test { public static void main(String[] args) { final CountDownLatch latch = new CountDownLatch(2); new Thr

2020-06-24 10:35:55 128

原创 java中的一些线程安全对象

ConcurrentHashMapConcurrentHashMap相比于Hashtable在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求。ConcurrentLinkedHashMapatomicinteger---源码public final long getAndIncrement() { while (true) { long current = get(); long next = current + 1; //当+1操作成功的时候直接

2020-06-24 10:23:44 197

原创 ThreadLocal的一些基础知识

原理在每个线程Thread内部有一个ThreadLocal.ThreadLocalMap类型的成员变量threadLocals,这个threadLocals就是用来存储实际的变量副本的,键值为当前ThreadLocal变量,value为变量副本(即T类型的变量)。原理图源码分析(ThreadLocal)public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map =

2020-06-24 09:34:50 96

原创 关于java中的CAS(乐观锁)的一些基本知识

CAS(非阻塞算法),CAS是由CPU硬件实现,所以执行相当快.CAS有三个操作参数:内存地址,期望值,要修改的新值,当期望值和内存当中的值进行比较不相等的时候,表示内存中的值已经被别线程改动过,这时候失败返回,当相等的时候,将内存中的值改为新的值,并返回成功。...

2020-06-24 09:27:29 94

原创 关于java死锁的一些基本知识

死锁原因一般来说,出现死锁问题需要满足以下条件:互斥条件:一个资源每次只能被一个线程使用。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。不可剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺。循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。只要破坏死锁 4 个必要条件之一中的任何一个,死锁问题就能被解决。避免死锁1、避免嵌套锁这是死锁最常见的原因,如果您已经持有一个资源,请避免锁定另一个资源。如果只使用一个对象锁,则几乎不可能出现死锁情况。2

2020-06-24 09:24:14 97

原创 volatile的一些基本用法

防止指令重排序首先看下以下线程A和线程B的部分代码:线程A:content = initContent(); //(1)isInit = true; //(2)线程Bwhile (isInit) { //(3)content.operation(); //(4)}从常规的理解来看,上面的代码是不会出问题的,但是JVM可以对它们在不改变数据依赖关系的情况下进行任意排序以提高程序性能(遵循as-if-serial语义,即不管怎么重排序

2020-06-24 09:17:24 106

原创 JAVA线程池的初始化方法

Executors.newCachedThreadPool()//创建一个缓冲池,缓冲池容量大小为Integer.MAX_VALUEnewCachedThreadPool将corePoolSize设置为0,将maximumPoolSize设置为Integer.MAX_VALUE,使用的SynchronousQueue,也就是说来了任务就创建线程运行,当线程空闲超过60秒,就销毁线程。Executors.newSingleThreadExecutor()//创建容量为1的缓冲池newSingleTh

2020-06-24 09:05:30 2121

原创 ScheduledExecutorService:Timer替代器

使用ScheduledExecutorService来替代Timer主要原因1、Timer不支持多线程。全部挂在Timer下的任务都是单线程的,任务仅仅能串行运行。假设当中一个任务运行时间过长,会影响到其它任务的运行2、Timer的线程不捕获异常。TimerTask假设抛出异常,那么Timer唯一的线程就会挂掉,这样挂在Timer下的全部任务都会无法继续运行。...

2020-06-24 08:58:41 373

原创 JAVA线程的生命周期

2020-06-23 18:06:16 81

原创 Java中实现线程阻塞的方法

Java中实现线程阻塞的方法线程睡眠:Thread.sleep (long millis)线程等待:Object类中的wait()方法线程礼让,Thread.yield() 方法线程自闭,join()方法线程睡眠:Thread.sleep (long millis)使线程转到阻塞状态。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性好。线程等待:Object类中的wait()方法导致当前的线程等待,直到其他线程调用此对象的 notify() 唤醒方法。wait() 使得线程

2020-06-23 17:56:51 2537 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除