自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 行为模式之责任链模式

[@toc]1 责任链模式介绍为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。责任链模式的核⼼是解决⼀组服务中的先后执⾏处理关系,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这增加了难度。这样的例子还有很多,如找领导出差报销、生活

2021-10-13 14:24:14 214

原创 02 Spring整体脉络(顶层接口)

1 回顾:使用springIOC的流程使用spring的时候,可以通过两种方式:xml配置和注解驱动的方式;最终通过ApplicationContext从ioc容器中就可以通过getBean的方式(通过BeanFactory的getBean的)生产 BeangetBean其实是生产Bean,并非是获取Bean,而是根据我们的配置给我们生产Bean,只是spring做了一层缓存,看起来像是获取获取Bean这里就有一个问题xml和注解驱动是通过不同的方式(ClassPathXmlApplic

2021-07-11 16:16:56 672

原创 jvm内存结构

文章目录1 jvm结构2 jvm的内存区域2.1 栈2.1.1 线程栈2.1.2 栈帧(方法栈帧)1 jvm结构一个类会通过jvm的第一个组成部分类装载子系统(C++实现),会把字节码文件丢到jvm的内存区域最终通过jvm的另一个组成部分字节码执行引擎执行内存区域的代码我们常说的jvm的内存模型说的就是 jvm的内存区域的划分,堆,栈,方法区,程序计数器这些玩意。另外,常说的 运行时常量池是方法区的一部分2 jvm的内存区域2.1 栈2.1.1 线程栈栈(线程栈),每当一个线程开

2021-07-07 22:32:13 232

原创 08 处理数据文件

文章目录1 排序数据(sort 命令)1.1 演示使用1.2 sort命令的参数2 搜索数据当你有大量数据时,通常很难处理这些信息及提取有用信息Linux系统提供了一些命令行工具来处理大量数据。1 排序数据(sort 命令)sort命令是对数据进行排序的。默认情况下,sort命令按照会话指定的默认语言的排序规则对文本文件中的数据行排序。1.1 演示使用文件内容如下:[admin@iZbp1hld5mqm15c6sdgqfkZ testSh]$ cat file13576429

2021-07-05 09:00:19 128

原创 简单实现一个http服务

文章目录1 阻塞式2 非阻塞式2.1 核心类介绍1 阻塞式代码结构2. 代码实现package study.wyy.net.http;import lombok.extern.slf4j.Slf4j;import java.io.FileInputStream;import java.io.IOException;import java.net.InetSocketAddress;import java.net.Socket;import java.net.URL;impor

2021-06-01 14:50:19 247

原创 10 客户端代码Demo(NIO)

如何用java.nio包中的类来创建客户程序EchoClient,本节提供了两种实现方式:采用阻塞模式,单线程。采用非阻塞模式,单线程。文章目录1 采用阻塞模式,单线程2 采用非阻塞模式,单线程1 采用阻塞模式,单线程这个已经在服务端代码Demo(NIO)中提到了,代码如下:package study.wyy.net.nio.client;import lombok.Builder;import lombok.extern.slf4j.Slf4j;import java.io.*;

2021-05-28 09:16:16 384

原创 响应式流规范基础知识

1 基本接口定义响应式流规范定义了4个主要接口:Publisher、Subscriber、Subscription和Processor。所有接口都存在于org.reactivestreams包中。在某种程度上,这些接口反映了RxJava中众所周知的类。这些接口中的前两个类似于ObservableObserver,与传统的发布-订阅模型比较相似。因此,前两个接口被命名为Publisher和Subscriber。...

2021-05-20 17:40:36 348

原创 RxJava的局限性和响应式流引入(响应式新标准)

先占个坑

2021-05-10 18:15:35 172

原创 响应式框架RxJavas使用:流转换

响应式编程包含一个Observable流、一个Subscriber,以及某种Subscription。该Subscription会传达Subscriber从Observable生产者处接收事件的意图。现在,是时候对流过响应式流的数据进行转换了。文章目录1 流转换1.1 map操作符:映射1.2 filter操作符1.3 count操作符1.4 zip操作符1 流转换操作符用于调整流的元素或更改流结构本身。虽然RxJava为几乎所有可能的场景提供了大量的操作符,将介绍最常用和最基础的操作符,因为大多数其

2021-05-10 18:13:41 128

原创 响应式框架RxJavas使用:构建Observable和订阅者

可先阅读:响应式框架RxJava介绍文章目录1 创建Observable2 生产异步序列3 Subscription1 创建Observable可以使用just来引用元素、使用旧式数组public static void main(String[] args) { Observable.just("java","python","go") .subscribe((next) -> System.out.println(next.toUpperCase()),.

2021-05-10 17:04:03 145

原创 响应式框架RxJava介绍

1 RxJava介绍Java平台上有一个用于响应式编程的标准库,即RxJava 1.1。正如我们今天在Java世界中知道的那样,该库为响应式编程铺平了道路。目前,它不是唯一的响应式库,我们还有Akka Streams和Project Reactor。RxJava是一个非常著名的开源库,是ReactiveX(Reactive Extensions)的一种Java实现,。ReactiveX是一种响应式扩展框架,有很多种实现,如RxAndroid、RxJS、RxSwift、RxRuby、RxCpp、RxGo等

2021-05-10 08:02:58 452

原创 spring构建响应式数据访问层

打死了就爱上了打开打算肯德基ask了解卡拉斯大陆的

2021-05-06 17:59:37 68

原创 springwebflux-构建响应式rest服务入门

文章目录1 依赖2 基于注释构建Rest服务3 基于函数式编程构建Rest服务3.1 函数式构建入门程序3.2 基于函数式构建Rest服务1 依赖要明确的是在spring5之后,spring开始支持响应式开发,并且内部支持两个响应式编程框架rxJavaproject-reactor(默认)在spring-boot2.0以后,使用的spring版本就是spring5,这里就是用springboot构建:<dependencies> <dependency>

2021-05-06 17:50:50 267

原创 projectreactor框架的操作符

project-reactor提供了大量操作符操作Flux和Mono对象文章目录1 转换操作符1.1. buffer1.2 map(映射)和flatMap1.3 window2 过滤操作符3 组合操作符4 条件操作符5 数学操作符6 observable工具操作符6.1. subscribe:注册订阅逻辑6.2 delay:事件的传递向后延迟一段时间6.3 timeout:超时配置6.4 block6.5 日志和调试操作符1 转换操作符只要是buffer,map,flatMap,window等1.1

2021-05-05 20:04:08 387

原创 projectreactor框架的Flux和Mono的创建

文章目录1 Flux组件1.1 创建Flux1.1.1 静态创建1.1.2 动态创建2 Mono组件1 Flux组件代表的就是一个异步序列,异步序列的三种通知都是适用于该组件,哪三种通知呢:// 正常的消息通知onNext()// 序列出错通知onComplete()// 错误通知onError()1.1 创建Flux1.1.1 静态创建静态方法just方法创建public static void main(String[] args) { Flux

2021-05-04 18:10:47 549 1

原创 响应式介绍(二)

Java平台上有一个用于响应式编程的标准库,即RxJava 1.1。目前,它不是唯一的响应式库,我们还有Akka Streams和Project Reactor。,随着2.版的发布,RxJava本身发生了很大的变化。虽然RxJava 1.的生命周期结束于2018年3月,但它仍然被用于很多库和应用程序,这主要是因为该版本被长期而广泛地采用。...

2021-05-01 22:57:11 112

原创 Spring的早期响应式解决方案和使用RxJava实现

有很多模式和编程技术能够成为响应式系统的构建模块。例如,回调和CompletableFuture通常用于实现消息驱动架构。我们还提到响应式编程是构建响应式系统的主要候选方案。在更深入地探讨这个问题之前,我们需要找到已经使用多年的其他解决方案。文章目录1 观察者模式1.1 实现一个观察者模式1.2 notifyObservers改进问题2 spring中的发布-订阅模式2.1 spring中的发布-订阅模式演示1 观察者模式观察者模式拥有一个主题(subject),其中包含该模式的依赖者列表,这些依赖者

2021-05-01 22:46:21 783 1

原创 响应式介绍

文章目录1 何为响应式1.1 为什么需要响应性1.2 如何具备即时响应性1.3 非阻塞消息通信1.4 响应式系统的基本原则2 服务级别的响应性2.1 回调技术2.2 异步回调2.2 juc包2.2.1 java.util.concurrent.Future2.2.2 CompletableFuture1 何为响应式1.1 为什么需要响应性假设我们的小型业务是开一家网店,销售一些价格颇具吸引力的尖端产品。与该领域的大多数项目一样,我们将聘请软件工程师来解决遇到的一切问题。我们选择了传统的开发方法,通过一

2021-05-01 17:48:44 3145

原创 并行流Parallel Stream和Spliterator接口

文章目录1 Parallel 入门2 Spliterator 接口2.1 Spliterator接口方法详解2.2 自定义Spliterator及Stream1 Parallel 入门 public static void main(String[] args) { long sum = 0L; for (long l = 0; l < 10_000_000; l++) { sum += l; }; }最简单传统的写法就是上面这样我们

2021-04-27 12:59:14 292

原创 CompletableFuture

文章目录1 介绍2 CompletableFuture的快速入门2.1 当作Future使用2.2 任务的异步运行2.2.1 异步执行Supplier类型的任务2.2.2 异步执行Runnable类型的任务2.3 异步任务链2.3.1 thenApply: 以同步的方式继续处理上一个异步任务的结果2.3.2 thenApplyAsync:以异步的方式继续处理上一个异步任务的结果。2.3.3 thenAcceptAsync:以异步的方式消费上一个异步任务的结果。2.3.4 thenRun:以同步的方式执行Ru

2021-04-27 11:19:08 221

原创 CompletionService

文章目录1 ExecutorService执行批量任务的缺陷3 CompletionService详解3.1 快速入门3.2 方法和构造方式3.2.1 构造3.2.2 提交任务3.2.3 获取futrue1 ExecutorService执行批量任务的缺陷Future接口提供了一种在未来某个时间节点判断异步任务是否完成执行、获取运算结果等操作的方式。如果在异步任务仍在继续运行之时执行get方法,会使得当前线程进入阻塞直到异步任务运行结束(正常结束/异常结束)。因此无论是通过ExecutorServi

2021-04-27 09:17:37 169

原创 ForkJoinPool

文章目录1 Fork/Join Framework介绍2 ForkJoinPool中的任务2.1 RecursiveTask2.2 RecursiveAction1 Fork/Join Framework介绍Fork/Join框架是在JDK1.7版本中被Doug Lea引入的,Fork/Join计算模型旨在充分利用多核CPU的并行运算能力,将一个复杂的任务拆分(fork)成若干个并行计算,然后将结果合并(join)在JDK中,Fork/Join框架的实现为ForkJoinPool及ForkJoinTa

2021-04-27 08:12:04 209 1

原创 Google Guava的Future

文章目录1 大撒大撒1 大撒大撒

2021-04-26 18:16:54 573

原创 Future和Callback

文章目录1 Future和Callback1.1 快速认识1.2 取消任务1.3 异常捕获2 ExecutorService与Future2.1 提交Runnable类型任务2.2 invokeAny2.3 invokeAll3 Future的不足之处1 Future和Callback简单来说,Future代表着一个异步任务在未来的执行结果,这个结果可以在最终的某个时间节点通过Future的get方法来获得,关于Future更多的细节和原理,可参考多线程设计模式:Future设计模式对于长时间运行的任

2021-04-26 18:15:34 1731

原创 Executors详解

文章目录1 介绍2 方法2.1 FixedThreadPool2.2 SingleThreadPool2.3 CachedThreadPool2.4 ScheduledThreadPool2.5 WorkStealingPool1 介绍Executors,Java并发包中提供了类似于工厂方法的类,用于创建不同的ExecutorService,当然还包括拒绝策略、ThreadFactory等2 方法2.1 FixedThreadPool// 创建ExecutorService,指定核心线程数pu

2021-04-26 17:32:29 636 1

原创 Executor&ExecutorService

文章目录1 介绍2 ExecutorService实现一:ThreadPoolExecutor2.1 快速认识ThreadPoolExecutor2.2 ThreadPoolExecutor的构造2.3 执行任务2.4 ThreadFactory接口2.5 拒绝策略RejectedExecutionHandler2.6 ThreadPoolExecutor的其他方法3 ExecutorService实现二:ScheduledExecutorService3.1 ScheduledThreadPoolExec

2021-04-26 17:13:11 345

原创 并发容器:ConcurrentMap(并发映射)

文章目录1 介绍2 ConcurrentHashMap2.1 JDK1.8版本以前的ConcurrentHashMap内部结构2.2 JDK1.8版本ConcurrentHashMap的内部结构3 ConcurrentSkipListMap简介1 介绍Map是一个接口,它的实现方式有很多种,比如常见的HashMap、LinkedHashMap,但是这些Map的实现并不是线程安全的,在多线程高并发的环境中会出现线程安全的问题。Hashtable或者SynchronizedMap虽然是线程安全的,但是在多线

2021-04-26 13:04:03 493

原创 并发容器:ConcurrentQueue(并发队列)简单介绍

文章目录1 介绍1 介绍在Java中有没有一种队列的实现方式可以不用关心临界值的判断,操作该队列的线程也不会被挂起并且等待被其他线程唤醒,我们只是单纯地向该队列中插入或者获取数据,并且该队列是线程安全的,是可以应用于高并发多线程的场景中呢?在JDK1.5版本以前要实现这些要求我们大致有两种方式,具体如下:通过synchronized关键字对非线程安全的队列或者链表的操作方法进行同步。使用Collections类的同步方法但是synchronized关键字相对于显式锁Lock甚至无锁的实现方式来

2021-04-26 12:50:54 1480

原创 并发容器:阻塞队列之LinkedTransferQueue

文章目录1 介绍2 TransferQueue的方法2.1 transfer方法1 介绍TransferQueue是一个继承了BlockingQueue的接口,并且增加了若干新的方法。LinkedTransferQueue是TransferQueue接口的实现类,其定义为一个无界的队列,具有FIFO的特性。这里就只介绍继承自TransferQueue的方法public interface TransferQueue<E> extends BlockingQueue<E> {

2021-04-26 11:39:18 178

原创 并发容器:阻塞队列之SynchronousQueue

文章目录1 介绍2 代码示例:数据交换1 介绍SynchronousQueue也是实现自BlockingQueue的一个阻塞队列,每一次对其的写入操作必须等待(阻塞)其他线程进行对应的移除操作,SynchronousQueue的内部并不会涉及容量、获取size,就连peek方法的返回值永远都将会是null,除此之外还有更多的方法在SynchronousQueue中也都未提供对应的支持(列举如下),因此在使用的过程中需要引起注意,否则会使得程序的运行出现不符合预期的错误。clear():清空队列的方法

2021-04-26 08:50:48 147

原创 并发容器:阻塞队列之DelayQueue

文章目录1 介绍2 基本使用2.1 入门演示1 介绍DelayQueue也是一个实现了BlockingQueue接口的“无边界”阻塞队列,但是该队列却是非常有意思和特殊的一个队列(存入DelayQueue中的数据元素会被延迟单位时间后才能消费),在DelayQueue中,元素也会根据优先级进行排序,这种排序可以是基于数据元素过期时间而进行的(比如,你可以将最快过期的数据元素排到队列头部,最晚过期的数据元素排到队尾)。对于存入DelayQueue中的元素是有一定要求的:元素类型必须是Delayed接

2021-04-25 18:18:54 161

原创 并发容器:阻塞队列之LinkedBlockingQueue

文章目录1 介绍1 介绍ArrayBlockingQueue是基于数组实现的FIFO“有边界”队列,PriorityBlockingQueue也是基于数组实现的,但它是“无边界”的优先级队列,由于存在对数据元素的排序规则,因此PriorityBlockingQueue并不能提供FIFO的约束担保LinkedBlockingQueue是“可选边界”基于链表实现的FIFO队列。LinkedBlockingQueue队列的边界可选性是通过构造函数来决定的,当我们在创建LinkedBlockingQueue

2021-04-25 17:23:39 141

原创 并发容器:阻塞队列之PriorityBlockingQueue

文章目录1 介绍2 使用2.1 构造2.2 不存在阻塞写方法2.3 优先级队列读方法1 介绍PriorityBlockingQueue优先级阻塞队列是一个“无边界”阻塞队列,该队列会根据某种规则(Comparator)对插入队列尾部的元素进行排序,因此该队列将不会遵循FIFO(first-in-first-out)的约束2 使用2.1 构造只要应用程序的内存足够使用,理论上,PriorityBlockingQueue存放数据的数量是“无边界”的,**在PriorityBlockingQueue内部

2021-04-25 17:16:51 151

原创 并发容器:阻塞队列之ArrayBlockingQueue

文章目录1 介绍2 API介绍2.1 阻塞式写方法2.2 非阻塞式写方法2.3 阻塞式读方法2.4 非阻塞式读方法3 生产者消费者1 介绍ArrayBlockingQueue是一个基于数组结构实现的FIFO阻塞队列,在构造该阻塞队列时需要指定队列中最大元素的数量(容量)。当队列已满时,若再次进行数据写入操作,则线程将会进入阻塞,一直等待直到其他线程对元素进行消费。当队列为空时,对该队列的消费线程将会进入阻塞,直到有其他线程写入数据。该阻塞队列中提供了不同形式的读写方法。2 API介绍2.1 阻塞式写

2021-04-25 17:02:34 287

原创 并发工具:Guava之RateLimiter

文章目录1 介绍2 RateLimiter的基本使用1 介绍RateLimiter,顾名思义就是速率(Rate)限流器(Limiter),事实上它的作用正如名字描述的那样,经常用于进行流量、访问等的限制,这一点与3.4节中介绍过的Semaphore非常类似,但是它们的关注点却完全不同,RateLimiter关注的是在单位时间里对资源的操作速率(在RateLimiter内部也存在许可证(permits)的概念,因此可以理解为在单位时间内允许颁发的许可证数量),而Semaphore则关注的是在同一时间内最多

2021-04-25 14:27:06 230

原创 并发工具:Guava之Monitor

文章目录1 Monitor介绍2 入门案例3 Monitor的其他方法1 Monitor介绍无论使用对象监视器的wait notify/notifyAll还是Condition的await signal/ signalAll方法调用,我们首先都会对共享数据的临界值进行判断,当条件满足或者不满足的时候才会调用相关方法使得当前线程挂起,或者唤醒wait队列/set中的线程,因此对共享数据临界值的判断非常关键,Guava的Monitor工具提供了一种将临界值判断抽取成Guard的处理方式,可以很方便地定义若干

2021-04-25 14:19:02 237

原创 并发工具:StampedLock

文章目录1 读写锁的饥饿写问题2 StampedLock的使用2.1 替代ReentrantLock2.2 替代ReentrantReadWriteLock2.3 乐观读模式3 总结1 读写锁的饥饿写问题所谓的饥饿写是指在使用读写锁的时候,读线程的数量远远大于写线程的数量,导致锁长期被读线程霸占,写线程无法获得对数据进行写操作的权限从而进入饥饿的状态(当然可以在构造读写锁时指定其为公平锁,读写线程获得执行权限得到的机会相对公平,但是当读线程大于写线程时,性能效率会比较低下)。因此在使用读写锁进行数据一

2021-04-25 13:55:29 122

原创 并发工具:Condition

显式锁Lock可以用来替代synchronized关键字,那么Condition接口将会很好地替代传统的、通过对象监视器调用wait()、notify()、notifyAll()线程间的通信方式Condition对象是由某个显式锁Lock创建的,一个显式锁Lock可以创建多个Condition对象与之关联,Condition的作用在于控制锁并且判断某个条件(临界值)是否满足,如果不满足,那么使用该锁的线程将会被挂起等待另外的线程将其唤醒,与此同时被挂起的线程将会进入阻塞队列中并且释放对显式锁Lock的持.

2021-04-23 16:52:32 149 1

原创 并发工具:ReadWriteLock和ReentrantReadWriteLock

对共享资源的访问一般包括两种类型的动作,读和写(修改、删除等会引起资源发生变化的动作),当多个线程同时对某个共享资源进行读取操作时,并不会引起共享资源数据不一致情况的发生(如表3-2所示),因此这个时候如果仍旧让资源的访问互斥,就会显得有些不合情理了,Doug Lea在JDK 1.5版本引入了读写锁类,旨在允许某个特定时刻多线程并发读取共享资源,提高系统性能和访问吞吐量。可参考: 多线程设计模式: 读写锁分离设计模式文章目录1 读写锁的基本使用方法1 读写锁的基本使用方法使用的过程中需要分别派生.

2021-04-23 11:54:28 128

原创 并发工具:Lock和ReentrantLock

在Java1.5版本以前,我们开发多线程程序只能通过关键字synchronized进行共享资源的同步、临界值的控制,虽然随着版本的不断升级,JDK对synchronized关键字的性能优化工作一直都没有停止过,但是synchronized在使用的过程中还是存在着比较多的缺陷和不足,因此在1.5版本以后JDK增加了对显式锁的支持,显式锁Lock除了能够完成关键字synchronized的语义和功能之外,它还提供了很多灵活方便的方法,比如,我们可以通过显式锁对象提供的方法查看有哪些线程被阻塞,可以创建Cond.

2021-04-23 11:49:14 204 1

空空如也

空空如也

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

TA关注的人

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