java
文章平均质量分 57
本自具足反求诸己
道生之,德畜之,物形之,势成之。
德之自身,其德乃真。
展开
-
Event Driven设计模式
Message(Event)无论是在同步还是异步的EDA中,没有使用任何同步方式进行控制,根本原因是Event被设计成了不可改变对象,因为Event在经过每一个Channel(Handler)的时候,都会创建一个全新的Event,多个线程之间不会出现资源竞争,不需要同步的保护。Events:需要被处理的数据。一个Event至少包含两个属性,类型和数据,类型决定了Events被哪个Handler处理,数据是Handler中代加工的材料。接收所有的Event,然后将其分配给合适的Handler处理。原创 2023-12-13 11:05:23 · 496 阅读 · 0 评论 -
Event Bus设计模式
EventBus是消息中间件的设计思想,在此设计中有三个非常重要的角色(Bus、Registry、Dispatcher),Bus主要负责提供给外部使用的操作方法;Registry注册表用来整理记录所有注册在EventBus上的Subscriber;Dispatcher主要负责对Subscriber消息进行推送(用反射的方式执行方法),考虑到程序的灵活性,Dispatcher方法也提供了Executor的多态方式。原创 2023-12-13 10:59:53 · 401 阅读 · 0 评论 -
Active Objects设计模式
第一种方法:当某个线程调用OrderService接口的findOrderDetails方法时,是会发送一个包含findOrderDetails方法参数以及OrderService具体实现的Message到Message队列,执行线程通过从队列中获取Message来调用具体的实现,接口的方法的调用和接口方法的执行分别处于不同的线程中,因此称该接口为Active Objects(可接受异步消息的主动对象)。第二种方法:第一种方法在接口方法非常多的情况下,会需要封装成很多的Message类。原创 2023-12-13 10:54:26 · 556 阅读 · 0 评论 -
Worker-Thread设计模式
线程池在某种意义上也算是Worker-Thread模式的一种实现,线程池初始化时创建线程类似于在流水线等待工作的工人,提交给线程池的Runnable接口类似于需要加工的产品,Runnable的run方法相当于组装该产品的说明书。Worker-Thread模式中生产线保存了在处理中的产品,并且是启动生产线的线程后,生产线启动若干数量的流水线工人线程 ,生产线聚合了产品和工人。生产者消费者模式是单纯的依赖关系,生产者和消费者都依赖产品队列,生产者和消费者是相互不知道。流水线工人:对传送带上的产品进行加工。原创 2023-12-13 10:44:24 · 248 阅读 · 0 评论 -
Two Phase Termination(两阶段)设计模式
无论是软类型的引用还是弱类型的引用,被垃圾回收器回收后,都会被存放到与之对应的引用队列中。强引用时平时使用最多的一种对象引用,当一个对象引用被关键字new实例化出来时,JVM会在堆内存中开辟一个内存区域,用于存放与该实例对应的数据结构。强引用的特点是,只要引用到ROOT根的路径可达,无论怎么GC都不会将其释放,宁可出现JVM内存溢出。LRU是一种数据冷热治理的思想,不经常使用数据称为冷数据,经常使用的数据称为热数据,对冷数据分配很少的资源或者提前释放,可以帮助节省更多的内存资源。原创 2023-12-13 10:40:54 · 291 阅读 · 0 评论 -
Thread-Per-Message设计模式
Thread-Per-Message是为每一个消息的处理开辟一个线程,以并发方式处理,提高系统整体的吞吐量。这种模式再日常开发中非常常见,为了避免线程的频繁创建和销毁,可以使用线程池来代替。原创 2023-12-13 10:35:08 · 399 阅读 · 0 评论 -
Latch(门阀)设计模式
Latch设计模式指定了一个屏障,只有所有条件满足时,门阀才能打开。Latch的作用是为了等待所有子任务完成后再执行其他任务。CountDownLatch的await超时的时候,已经完成的任务正常结束,未按时完成的任务不会被中断,还会继续执行,它不提供线程管理方面的支持。原创 2023-12-13 10:30:17 · 241 阅读 · 0 评论 -
Balking(犹豫)设计模式
多个线程监控某个共享变量,A线程监控到共享变量发生变化后即将触发某个动作,但此时发现有另外一个线程B已经针对该变量的变化开始了行动,因此A便放弃了准备开始的工作,我们把这样的线程交互称为Balking(犹豫)设计模式。原创 2023-12-13 10:26:42 · 188 阅读 · 0 评论 -
线程上下文设计模式
线程上下文机制是参考应用或者系统上下文的机制,使每个线程拥有自己的上下文,不与其他线程共享。线程上下文机制有不同于其他上下文机制的地方,即线程的生命周期结束后,线程上下文也要回收掉,不然容易出现内存泄露。 ThreadLocal为每一使用该变量的线程都提供了独立副本,可以做到线程间的数据隔离,每个线程都可以访问各自内部的副本变量。使用ThreadLocal的场景有: 在进行对象跨层传递的时候,可以考虑使用,避免方法多次传递,打破层次间的约束。 线程间的数据隔离 进原创 2023-12-13 10:23:11 · 269 阅读 · 0 评论 -
Guarded Suspension(担保挂起)设计模式
当线程访问某个对象时,发现条件不满足,暂时挂起等待条件满足时再次访问。Guarded Suspension模式是一个非常基础的模式,主要关注(临界值)不满足时将操作的线程正确挂起,以防止出现数据不一致或者操作超过临界值的控制范围。它是很多线程设计模式的基础。原创 2023-12-13 10:20:39 · 247 阅读 · 0 评论 -
Future设计模式
Future设计模式,针对长时间执行任务场景,提供了一种凭据式解决方案。Future提供了获取计算结果和判断是否完成的两个方法,其中获取计算结果将会导致调用阻塞(在任务未完成的情况下)。原创 2023-12-13 10:17:23 · 138 阅读 · 0 评论 -
不可变对象设计模式
共享的资源,是指在多个线程同时对其访问的情况下,各个线程都会使其发生变化,线程安全的目的是在受控的并发访问中防止数据发生变化。除了使用synchronized关键字同步对资源的写操作之外,还可以在线程间不共享资源状态,甚至将资源的状态设置为不可变。不可变最核心的地方在于不给外部修改共享资源的机会。原创 2023-12-13 10:11:05 · 150 阅读 · 0 评论 -
Single Thread Execution设计模式
反之,就是非线程安全的类。子类如果继承了线程安全的类并且打破了Single Thread Execution的方式,就会破坏安全性,这种情况一般称为继承异常。在这个模式中,synchronized关键字起到了决定性的作用,但是排他性是以牺牲性能为代价的,在保证线程安全的前提下,尽量缩小synchronized的作用域。Single Thread Execution模式是指在同一时刻只能有一个线程去访问共享资源,即采用排他方式的操作保证在同一个时刻只能有一个线程访问共享。多个线程对某个类状态发生改变的时候。原创 2023-12-13 10:08:36 · 276 阅读 · 0 评论 -
Metrics(Powerful Toolkit For Measure)
Metrics提供了强大的数据收集方式,并且在Metrics内部集成了CSV、JMX、Log、Console四大Reporter,Reporter是一个非常容易扩展的接口,使用者可以通过自定义Reporter形式将Metrics收集到的数据展示(存储)在任何地方。CsvReporter与logger reporter比较类似,因为CSV文件不同于日志可以通过配置的方式处理,需要在创建CsvReporter时,显式指定一个存在的目录,以存放Reporter输出的CSV文件,如果该目录不存在则会出现错误。原创 2023-12-12 13:40:34 · 99 阅读 · 0 评论 -
并发包工具类详解
饥饿写是指在使用读写锁的时候,读线程的数量远远大于写线程的数量,导致锁长期被读线程霸占,写线程无法获得锁从而进入饥饿状态。当构造读写锁的时候指定其为公平锁,读写线程获得锁的机会相对公平,但是当读线程远远大于写线程的时候,写线程的效率会比较底下。2、新添加的数据如果超过桶的容量,则请求将被直接拒绝;Monitor工具提供了一种将临界值判断抽取成Guard的处理方式,可以方便地定义若干个Guard也就是临界值的判断,以及对临界值判断的重复使用,除此之外,还具备synchronized和Lock的完整语义。原创 2023-12-12 13:36:53 · 67 阅读 · 0 评论 -
Java Streams详解
Stream为容器的使用提供了新的方式,允许通过陈述式编码风格对容器中的数据进行分组、过滤、计算、排序、聚合、循环等操作。这里的Stream不是输入输出流,而是Java 8对Collection的一个增强,专注于对集合对象便利又高效的聚合操作,支持串行操作功能,还能借助Fork/Join机制支持并行模式,在多核CPU的环境下,最大程度的来利用CPU超快计算能力。Collector在Stream中主要的用途大致分三项:1、Reduce和Summarizing Stream的元素到一个单一的新输出中;原创 2023-12-12 13:29:19 · 66 阅读 · 0 评论 -
线程池基本原理与并发包ExecutorService
一个完整的线程池应该具备以下要素: 任务队列:用于缓存提交的任务 线程数量管理功能:一个线程池必须能够很好的管理和控制线程数量,可以通过如下三个参数来实现,初始线程数量、最大线程数量、最低活跃线程数量或核心线程数量 任务拒绝策略:任务数量达到上限且任务队列已满,需要相应的拒绝策略通知任务提交者 线程工厂:用于个性化定制线程 QueueSize:任务队列的最大数量限制 Keepedalive时间:决定线程各个重要参数自动维护的时间间隔 直接使用J原创 2023-12-12 13:26:19 · 129 阅读 · 0 评论 -
并发包容器详解
CopyOnWrite容器是一种并发容器,简称COW,基本实现思想:在程序运行的初期,所有线程都共享一个数据集合的引用,所有线程对该容器的读取操作将不会对数据集合产生加锁的动作,当有线程对该容器中的数据集合进行删除或增加等写操作时,才会对整个数据集合进行加锁操作,然后将容器中的数据集合复制一份,并且基于最新的复制进行删除或增加等写操作,当写操作执行完毕时,将最新复制的数据集合引用指向原有的数据集合,从而达到读写分离最终一致性的目的。该容器的最大边界是通过构造函数指定的,默认是整型的最大值。原创 2023-12-12 13:16:37 · 42 阅读 · 0 评论 -
并发包原子类详解
若修改成功返回true。compareAndSet(V expectReference, V newReference, int expectedStamp, int newStamped):与其他原子类型的CAS算法类似,如果引用当前的值、版本号与expect的值、版本号一致,则将引用更新为新的值、版本号。AtomicLong提供了原子操作Long类型数据的解决方案,是Number类的子类,提供的原子性方法在使用习惯上与AtomicInteger非常一致。但是Unsafe使用不当,造成的错误是灾难性的。原创 2023-12-12 13:14:27 · 61 阅读 · 0 评论 -
线程组、线程切换、线程异常
JVM进程的退出是由于JVM进程中没有活跃的非守护线程,或者收到了系统中断信号,向JVM程序注入一个Hook线程,在JVM进程退出时,Hook线程会启动执行,通过Runtime可以为JVM注入多个Hook线程。中断一个线程组,会导致线程组中所有的活跃线程都被中断。可以设置一个线程组为守护线程组,当线程组中没有任何活跃线程时,守护线程组也会自动销毁。destroy():当线程组中没有活跃线程时,从线程组的父线程组中移除并且销毁。main线程执行结束后,守护线程执行结束,守护线程结束后,钩子线程执行。原创 2023-12-11 10:04:29 · 56 阅读 · 0 评论 -
定时器Timer、多线程下的单例模式
schedule(TimerTask task, long delay, long period):以当前时间为基准,延迟delay的毫秒数后,再以period为周期,周期性执行task。schedule(TimerTask task, Date date, long period):在指定的日期date之后,按照period周期,无限循环执行task。schedule(TimerTask task, long delay):以当前时间为基准,延迟delay的毫秒数后,执行一次task。原创 2023-12-11 10:01:44 · 498 阅读 · 0 评论 -
显式锁的使用
Object类的wait方法相当于Condition类的await方法,Object类的notify方法相当于Condition类的signal方法,Object类的notifyAll方法相当于Condition类的signalAll方法。锁Lock分为公平锁和非公平锁,公平锁表示获取锁的顺序是按照线程加锁的顺序来分配的,即FIFO;这个类是读写锁机制,与读操作相关的锁也称为共享锁,与写操作相关的锁也称为排他锁,除了读锁与读锁之间不互斥,其他情况均互斥。isFair方法是判断此lock是不是公平锁。原创 2023-12-11 09:56:05 · 46 阅读 · 0 评论 -
线程间的通信
notify方法需要在同步区域中调用,在调用时必须获得该对象的对象级别锁,所用是通知哪些等待该对象的对象锁的其他线程,如果有多个线程等待,则由线程规划器随机挑选出其中一个呈现wait状态的线程,对其发出notify,使它获得该对象的对象锁。在执行notify之后,线程不会马上释放锁,wait状态的线程也不能马上获得对象锁,需要等到notify方法的线程推出同步区域后,当前线程才会释放锁,wait状态的线程才可以获得对象锁。在调用wait方法时,线程必须获得该对象的对象级别锁。当线程全部运行结束时移除。原创 2023-12-11 09:46:55 · 52 阅读 · 0 评论 -
对象和变量的并发访问
synchronized修饰的方法或者代码块为同步区域,在同步区域内使用的共享变量在使用时,会从主存中获取值,离开同步区域时,将值写回到主存中。当一个线程获得一个对象锁之后,再次请求此对象锁时,可以再次获得该对象的锁,即一个synchronized方法或程序块的内部调用本类的其他synchronized方法或程序块,是永远可以得到锁的。当同步区域出现异常时,锁会自动释放掉。atomic是java中的可以同步类,类中的操作可以做到线程安全,当调用原子类中的操作的过程是非线程安全的,有可能会产生脏读的情况。原创 2023-12-11 09:35:19 · 42 阅读 · 0 评论 -
多线程基本技能
守护线程是一种特殊线程,陪伴其他线程,当其他线程全部关闭后,守护线程才会结束。通常使用线程的默认优先级即可。进程是应用程序的重量级执行单位,线程是进程中任务的轻量级执行单位,进程提供了线程的共享数据和上下文执行环境。thread.setName(String name):在线程启动之前修改线程的name,一般情况下,遵循业务逻辑的需要,都要给线程提供name。Thread类是创建线程的唯一方式,实现线程执行单元有两种方式:重写Thread类的run方法和实现Runnable接口的run方法。原创 2023-12-11 09:29:52 · 37 阅读 · 0 评论 -
借鉴前端事件机制的Spring AOP
面向切面编程是将前端事件机制迁移到后端的结果。原创 2022-07-26 16:12:08 · 202 阅读 · 1 评论 -
测试同步、锁、原子引用的性能
代码:import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicReference;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;import org.openjdk.jmh.annotations.Benchmark;import org.openjdk.jm原创 2021-01-07 10:21:19 · 204 阅读 · 0 评论 -
测试Java同步、锁、原子类的同步性能
代码:import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;import org.openjdk.jmh.annotations.Benchmark;import org.openjdk.jmh.ann原创 2021-01-06 17:31:29 · 200 阅读 · 0 评论 -
从设计模式怎样提升设计
设计模式是一种非常有用的设计参照,基本上每次去读设计模式的内容总是会获得新的体会。但是有没有新的模式呢?我想,这个大概是有的,不过新的模式产生估计会非常困难。在编码一段时间之后,大概在一年或者两年之后,我们一般都在想,可不可以把编码做的更好一些,让别人更加容易阅读,更加好维护,更加好修改。怀着这种简单的想法,我开始学习怎么去改良代码。设计模式引领我从纯粹的实现到技术设计方面的思考,也同时非常感原创 2017-10-22 10:35:28 · 391 阅读 · 0 评论 -
代码重构之灾
做过很多的项目,最终你会发现其代码质量是非常有问题的。项目的外包制度、不断基于老的代码上做二次开发并高呼“不要重复造轮子”、开发人员的能运行就可以的态度等等不断将项目的代码拖进无底洞,项目的代码急剧扩大,问题却也爆炸性的增长。最近做的项目就是基于老的项目上做新的项目,其中问题很多。问题分析如下:1.总体项目的设计是公共基础+应用部分的功能。应用部分的功能是互不干扰的数据流,不做每个应用的过原创 2017-10-02 10:23:32 · 524 阅读 · 0 评论 -
多线程执行时间的差异
在Java当中,多线程执行时间是非顺序,这个究竟是怎么回事?举例代码:public class ICurrentThread extends Thread { @Override public void run(){ super.run(); System.out.println("this is my thread"); }}public class CreateTh原创 2017-08-13 09:08:07 · 2466 阅读 · 0 评论 -
JVM处理兼容具体措施的分析
JVM是处理平台无关性的重要的基础,是解决平台差异性最主要的手段,在解决兼容性问题上,它采用了那些措施,原因是什么?措施1:采用虚拟机执行引擎体系结构由自己实现,并不是基于实际的处理器、指令集和操作系统上原因:基于自行定义的虚拟执行引擎可以做到封装底层多变的细节,保证统一的引擎外观。底层多别的细节封装有具体的JVM来处理。措施2:在class字节码文件中,对文件中数据长原创 2017-07-09 15:59:30 · 441 阅读 · 0 评论 -
java与并发
并发机制是一种常用的提升计算机运算效率的一种机制,这种机制针对的问题,可能看了很多遍书的人都没有想过。这个问题是:CPU的运算速度要超过内存存取的速度很多,内存存取的速度要超过外部I/O的速度很多。于是为了提高CPU的有效利用率,人们想到了一种办法,就是让CPU同时同时执行多项任务,CPU进行分时工作,这样就引申出了并发的概念。并发要解决的问题:任务的优先级、资源的分配,任务调度等一系列的问题。原创 2017-07-16 17:56:33 · 248 阅读 · 0 评论 -
java 关于封装jdbc操作接口的一些做法
首先建立如下图所示的包结构:然后首先件里模型model包下的两个类:package model;public abstract class Bean { }下面是User类的代码:package model;import java.util.Date;public class User extends Bean原创 2013-03-24 15:44:24 · 1699 阅读 · 0 评论 -
多线程专题 - 多线程的同步
多线程的同步是在指定区域形成只允许单线程运行的机制。 synchronized同步方法 synchronized同步语句块 volatile关键字 1.synchronized同步方法非线程安全问题存在于实例变量中,如果是方法内部的私有变量则不存在非线程安全问题。如果多个线程共同访问一个对象中的实例变量,则有可能出现非线程安全问题。关键字synchronized取得的...原创 2018-08-28 17:46:55 · 185 阅读 · 0 评论 -
多线程专题 - java中多线程的基本操作
多线程的存在的现实意义:计算机CPU的运行速度远远高于I/O的原型速度,为了更好的利用CPU,所以开辟了多线程机制,使用CPU时间分片这种方法来提高CPU的使用率。 多线程的创建 多线程状态的检测和控制 多线程运行顺序 守护线程 1.多线程的创建这个大家都很熟悉,有两种方法,第一种是继承Thread类;第二种是实现Runnable接口的对象作为Thread类的构造参数,创建...原创 2018-08-24 18:04:21 · 157 阅读 · 0 评论 -
多线程专题 - 线程间的通信
这一部分是多线程基础中非常基础的部分。 等待 / 通知机制 join的作用 ThreadLocal的使用 InheritableThreadLocal的使用 1.等待 / 通知机制等待通知 / 通知的机制模型如下所示:设定线程A为等待线程,线程B为通知线程,交互过程如下:第一步.线程A请求异步服务,异步服务的结果由线程B运行提供,现在线程A发起服务请求后,进入等待状...原创 2018-09-04 15:30:14 · 134 阅读 · 0 评论 -
多线程专题 - 锁的使用
使用ReentrantLock类 使用ReentrantReadWriteLock类 1.使用ReentrantLock类样例代码:import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class BusinessService {...原创 2018-09-04 15:33:41 · 141 阅读 · 0 评论 -
多线程专题 - 定时器Timer
Timer是一个线程安全的类,多线程会共享一个Timer的对象。这个类提供的定时设置并不提供准时的保障,它安排定时任务使用的机制是object.wait(long)方法。如果一个定时器要启动多个定时任务,因为其中有个定时任务执行时间太长导致后续任务延时的话,后续的任务会以追赶加急的方式执行,但是要保证准时,则需要在设置定时任务时进行设计上的保证。如果一个定时器启动了多个定时任务,当定时器取消的时候...原创 2018-09-06 11:49:19 · 283 阅读 · 0 评论 -
多线程专题 - 单例模式和多线程
立即加载 延迟加载 使用静态内置类实现单例模式 序列化和反序列化的单例模式实现 使用static代码块实现单例模式 完善使用enum美剧实现单例模式 1.立即加载的单例模式public class Singleton {private static Singleton instance=new Singleton();private Singleton() {}...原创 2018-09-06 11:52:11 · 145 阅读 · 0 评论