自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java线程池底层原理分析源码分析

java线程池源码解读

2021-03-14 19:29:41 265

原创 java中常用用具类介绍

java常用工具类

2021-02-28 19:19:47 480

原创 JAVA中的阻塞队列与非阻塞队列

阻塞队列BlockingQueue接口下的各个实现类及部分源码介绍,BlockingQueue 对插入操作、移除操作、获取元素操作提供了四种不同的方法用于不同的场景中使用:抛出异常,如果队列为空或队列已满直接抛异常返回特殊值(null 或 true/false)阻塞等待此操作,直到这个操作成功阻塞等待此操作,直到成功或者超时指定时间。操作抛异常插入add(e)移除remove()...

2021-02-11 11:22:11 228

原创 ReentrantReadWriteLock源码分析

ReentrantReadWriteLock读写锁,本身也是有AQS实现的,主要分为独占与共享两种状态,我们知道AQS中使用state状态来区分是否获取到锁,在独占模式下如果state == 0说明没有获取到独占锁,state != 0说明有其他线程获取到独占锁。在共享模式下,如果state < 0代表没有获取到共享锁,在CountDownLatch中如果state 不等于 0说明获取不到共享锁,在Semaphore中state小于1获取不到共享锁。独占模式来说,0 代表可获取锁,1 代表锁被别

2021-02-09 12:19:39 266 3

原创 从CyclicBarrier到AQS

写在前面CyclicBarrier 源码学习AQSdemo就是让多个线程一起执行,多线程同时到达栅栏点,等到达栅栏点的线程等于count时,所有线程往下执行public static void main(String[] args) throws Exception { CyclicBarrier cyclicBarrier = new CyclicBarrier(11, new Runnable() { public void run() { System

2021-01-31 17:58:15 146

原创 从CountDownLatch到AQS

写在前面CountDownLatch源码学习AQSdemopublic static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(2); new Thread(()->{ try { System.out.println("线程1执行"); Thread.s

2021-01-31 17:20:17 113

原创 从Semaphore到AQS

写在前面Semaphore源码学习AQSdemo及源码学习Semaphore 信号量,就是限流,每次只能允许获取到信号量的线程执行public static void main(String[] args) { Semaphore semaphore = new Semaphore(2); for (int i = 1; i <= 5; i++) { new Thread(()->{ try { semapho

2021-01-31 14:14:38 122

原创 从Condition到AQS

写在前面Condition源码学习AQSdemoCondition必须依赖lock,需要在锁下创建condition。类似wait、notify或notifyAll 与 synchronized 的关系咱们根据这个demo来解读condition代码public static void main(String[] args) { Lock lock = new ReentrantLock(); Condition condition = lock.newCondition();

2021-01-30 22:04:43 107

原创 从ReentrantLock到AQS

写在前面Doug Lea 的JUC源码写的是非常漂亮的,非常值得我们学习。我们慢慢一步步学习下JUC下的源码,我们在AOS(AbstractQueuedSynchronizer)开始学习吧。AQSAQS具备特性阻塞等待队列共享/独占公平/非公平可重入允许中断待续...

2021-01-14 22:48:37 146

原创 synchronized使用及底层原理详解

多线程编程中,有可能会出现多个线程同时访问同一个共享、可变资源的情况,这个资源我们称之其为临界资源;这种资源可能是:对象、变量、文件等。共享:资源可以由多个线程同时访问可变:资源可以在其生命周期内被修改引出的问题:由于线程执行的过程是不可控的,所以需要采用同步机制来协同对对象可变状态的访问加锁作用与锁定义分类加锁目的:序列化访问临界资源,即同一时刻只能有一个线程访问临界资源(同步互斥访问)synchronized原理详解synchronized内置锁是一种对象锁(锁的是对象而非引用)

2021-01-14 22:43:23 347 1

原创 volatile原理详解

volatile关键字有如下两个作用保证被volatile修饰的共享变量对所有线程总数可见的,也就是当一个线程修改了一个被volatile修饰共享变量的值,新值总是可以被其他线程立即得知。禁止指令重排序优化。volatile的可见性volatile无法保证原子性...

2021-01-14 10:10:26 307

原创 线程与JMM模型

线程线程的概念现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作系统就会创建一个Java进程。现代操作系统调度CPU的最小单元是线程,也叫轻量级进程。线程的实现可以分为两类:用户级线程(User-Level Thread)内核线线程(Kernel-Level Thread)线程的生命周期并发在现代多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。即使是单核处理器也支持多线程执行代码,C

2021-01-12 21:59:58 103

原创 Netty中的细节整理

截断流水线处理如果我们有时候业务条件不满足,需要阶段流水线处理,不让进入处理下一战,我们如何做呢通过前面的分析,我们现在整理一下不调用supper.chanelXxx(ChannelHandlerContext…)方法不调用ctx.fireChannelXxxhandler业务处理器的热拔插找到chanelPipeline接口,我们有如下方法//在头部增加一个handlerChannelPipeline addFirst(String name, ChannelHandler handl

2020-12-26 17:28:53 657

原创 Netty设计模式与源码分析(三)

accept事件NioEventLoop.run方法,最终执行processSelectedKeys方法,因为此时我们有客户端连接事件,我们有accept事件后就会有SelectedKeys,我们此时就会操作SelectedKeys。 private void processSelectedKeys() { if (selectedKeys != null) { //执行这里 processSelectedKeysOptimized(); } el

2020-12-16 22:49:44 319 1

原创 Netty设计模式与源码分析(二)

注册 Channel 的 register 操作经过前面的铺垫,我们已经具备一定的基础了,我们开始来把前面学到的内容揉在一起。这节,我们会介绍 register 操作,这一步其实是非常关键的,对于我们源码分析非常重要。selector如何注册到serverSocket上的继续跟踪代码bind//绑定一个端口并且同步, 生成了一个ChannelFuture异步对象,通过isDone()等方法可以判断异步=事件的执行情况//启动服务器(并绑定端口),bind是异步操作,sync方法是等待异步操作执行

2020-12-12 20:55:59 354

原创 Netty设计模式与源码分析(一)

一、Netty源码分析大名鼎鼎的Reactor模式Reactor模式的组成元素channel和selector属于 java.nio 包中的类,分别为网络通信中的通道(连接)和选择器。Reactor和 handler 属于Reactor模型高性能编程中的应用程序角色,分别为反应器和处理器。Reactor模式的三步曲第一步:注册将channel 通道的就绪事件,注册到选择器Selector。监听新的连接。第二步:轮询轮询的代码,是Reactor重要的一个组成部分,或者说核心的部分。轮询选择

2020-12-12 16:39:18 352

原创 spring环境使用观察者模式ApplicationListener

spring环境使用观察者模式ApplicationListenerdemojdk自带实现观察者demo具体事件对象类public class MyEvent extends ApplicationEvent { public MyEvent(Object source) { super(source); } public <T> T getEventSource(Class<T> tClass){ return JS

2020-09-08 20:00:19 160

原创 spring创建对象执行步骤

spring生命周期spring生命周期spring生命周期注:ApplicationContext 对象,spring上下文对象,根据此对象可以获取spring中的对象。package com.example.demo.service;import com.sun.media.sound.SoftTuning;import org.springframework.beans.BeansException;import org.springframework.beans.factory.*;

2020-09-08 19:10:03 502

原创 jdk1.8新特性(2)

jdk1.8新特性(2)自定义函数式接口编程JDK8自带函数式接口consumerfunctionSupplierPredicate方法的函数调用自定义函数式接口编程我们今天再次定义一个函数式接口,加强一个函数式编程思想,直接上代码,根据代码中demo可以很好帮助我们理解函数式编程。@FunctionalInterfaceinterface Functions<T,K>{ public K get(T t1,T t2);}public class Function {

2020-09-05 15:51:14 652

原创 jdk1.8新特性(1)

jdk1.8新特性接口增强base64三级目录接口增强接口中default、static关键字可以有方法体,可以实现逻辑public interface People { //不需要被实现,当然也可以实现 default void eat(){ System.out.println("我是接口中eat方法,在吃东西"); } //无法实现 static void dirnk(){ System.out.println("我是接口中

2020-09-05 14:17:54 234

原创 java多线程设计模式demo

多线程设计模式Master-worker模式生产者消费者模式furture模式Master-worker模式Master-worker模式主要由两个角色组成,master主要负责任务的分发,worker主要是任务执行生产者消费者模式furture模式

2020-08-30 15:16:07 312

原创 java打印线程、堆dump

java打印线程、堆dump查看pid查看线程快照堆快照jvisualvmjconsole内存溢出自动打印堆dumpjmap -head pid查看pidips 命令,找到你当前系统名字的pid,pid很重要,后续的很多命令都是根据pid来查询的。注意:tomcat的为bootstrap查看线程快照jstack -l pid例子:jstack -l 12340 >a.text获取线程快照信息重定向到当前目录a.text注意:线程快照分析我们以后再说堆快照jmap -dump:

2020-08-30 13:53:48 4626

原创 springboot整合Caffeine本地缓存

Caffeine基本配置配置类在项目中,有些数据往往读多写少,我们通常放入redis缓存中,但有时感觉大材小用,我们会把部分数据存入本地缓存中,我们前面讲到了,guava cache就是比较优秀的一种,在Spring Boot 2.0中将Caffeine取代Guava,已不再提供guava的支持。说到spring的支持,主要是很方便使用@Cacheable、@CachePut、@CacheEvict、@Caching等注解基本配置application.propertiesspring.cache.

2020-08-23 14:58:46 1088

原创 guava-3(实现观察者模式)

guava实现观察者模式demodemo利用guava可以很简单实现观察这模式,而且guava还是基于方法的,非常的灵活public class Demo { public static void main(String[] args) throws ExecutionException, InterruptedException { EventBus eventBus = new EventBus(); Observer1 observer1 = new O

2020-08-22 18:43:34 293 1

原创 guava-2(cache缓存)

缓存为什么用guava cache最简单demokey不存在也想返回某个计算逻辑数据第一种方式第二种形式限制缓存大小缓存条数缓存自定义数据,可以时value的大小限制缓存时间expireAfterWrite:从写入时间开始算expireAfterAccess:最后一次访问时间缓存回收监听器统计分析cache整合springboot为什么用guava cache有些情况我们不需要用redis,觉得大材小用了,二guava正好是本地缓存中比较优秀的一种,guava cache跟ConcurrentMap很想

2020-08-22 18:32:50 205

原创 guava-1(集合操作)

guava是什么Guava是Java项目广泛第三方库,其中包括:集合 、缓存 、原生类型支持 、并发库 、通用注解 、字符串处理 、I/O 等等。 所有这些工具每天都在被java工程b师应用在业务服务中。集合再jdk1.7之前,原生jdk对集合操作并不友好,使用guava的集合很大程度上方便了我们对集合的操作。不可变集合新集合类型Multiset很方便获取集合中元素的个数public static void main(String[] args) { //此时也是使用gu

2020-08-16 18:21:27 449

原创 拦截器获取restful风格requestMapping、参数

springMVC获取requestMapping、restful风格中路径的参数springMVC获取requestMapping、restful风格中路径的参数如何获取requestMapping获取参数springMVC获取requestMapping、restful风格中路径的参数当我们使用spring框架时候,在拦截器或aop时有时会使用到方法中的参数或者是映射地址来帮助我们处理业务逻辑。我们怎么获取他们呢,spring已经给我们封装好了,直接拿来就可以使用。如何获取requestMappi

2020-08-16 17:04:10 2211

空空如也

空空如也

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

TA关注的人

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