自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

seacean2000的专栏

行有不得,反求诸己

  • 博客(513)
  • 资源 (2)
  • 收藏
  • 关注

原创 Event Driven设计模式

Message(Event)无论是在同步还是异步的EDA中,没有使用任何同步方式进行控制,根本原因是Event被设计成了不可改变对象,因为Event在经过每一个Channel(Handler)的时候,都会创建一个全新的Event,多个线程之间不会出现资源竞争,不需要同步的保护。Events:需要被处理的数据。一个Event至少包含两个属性,类型和数据,类型决定了Events被哪个Handler处理,数据是Handler中代加工的材料。接收所有的Event,然后将其分配给合适的Handler处理。

2023-12-13 11:05:23 178

原创 Event Bus设计模式

EventBus是消息中间件的设计思想,在此设计中有三个非常重要的角色(Bus、Registry、Dispatcher),Bus主要负责提供给外部使用的操作方法;Registry注册表用来整理记录所有注册在EventBus上的Subscriber;Dispatcher主要负责对Subscriber消息进行推送(用反射的方式执行方法),考虑到程序的灵活性,Dispatcher方法也提供了Executor的多态方式。

2023-12-13 10:59:53 155

原创 Active Objects设计模式

第一种方法:当某个线程调用OrderService接口的findOrderDetails方法时,是会发送一个包含findOrderDetails方法参数以及OrderService具体实现的Message到Message队列,执行线程通过从队列中获取Message来调用具体的实现,接口的方法的调用和接口方法的执行分别处于不同的线程中,因此称该接口为Active Objects(可接受异步消息的主动对象)。第二种方法:第一种方法在接口方法非常多的情况下,会需要封装成很多的Message类。

2023-12-13 10:54:26 261

原创 Worker-Thread设计模式

线程池在某种意义上也算是Worker-Thread模式的一种实现,线程池初始化时创建线程类似于在流水线等待工作的工人,提交给线程池的Runnable接口类似于需要加工的产品,Runnable的run方法相当于组装该产品的说明书。Worker-Thread模式中生产线保存了在处理中的产品,并且是启动生产线的线程后,生产线启动若干数量的流水线工人线程 ,生产线聚合了产品和工人。生产者消费者模式是单纯的依赖关系,生产者和消费者都依赖产品队列,生产者和消费者是相互不知道。流水线工人:对传送带上的产品进行加工。

2023-12-13 10:44:24 227

原创 Two Phase Termination(两阶段)设计模式

无论是软类型的引用还是弱类型的引用,被垃圾回收器回收后,都会被存放到与之对应的引用队列中。强引用时平时使用最多的一种对象引用,当一个对象引用被关键字new实例化出来时,JVM会在堆内存中开辟一个内存区域,用于存放与该实例对应的数据结构。强引用的特点是,只要引用到ROOT根的路径可达,无论怎么GC都不会将其释放,宁可出现JVM内存溢出。LRU是一种数据冷热治理的思想,不经常使用数据称为冷数据,经常使用的数据称为热数据,对冷数据分配很少的资源或者提前释放,可以帮助节省更多的内存资源。

2023-12-13 10:40:54 256

原创 Thread-Per-Message设计模式

Thread-Per-Message是为每一个消息的处理开辟一个线程,以并发方式处理,提高系统整体的吞吐量。这种模式再日常开发中非常常见,为了避免线程的频繁创建和销毁,可以使用线程池来代替。

2023-12-13 10:35:08 382

原创 Latch(门阀)设计模式

Latch设计模式指定了一个屏障,只有所有条件满足时,门阀才能打开。Latch的作用是为了等待所有子任务完成后再执行其他任务。CountDownLatch的await超时的时候,已经完成的任务正常结束,未按时完成的任务不会被中断,还会继续执行,它不提供线程管理方面的支持。

2023-12-13 10:30:17 199

原创 Balking(犹豫)设计模式

多个线程监控某个共享变量,A线程监控到共享变量发生变化后即将触发某个动作,但此时发现有另外一个线程B已经针对该变量的变化开始了行动,因此A便放弃了准备开始的工作,我们把这样的线程交互称为Balking(犹豫)设计模式。

2023-12-13 10:26:42 172

原创 线程上下文设计模式

线程上下文机制是参考应用或者系统上下文的机制,使每个线程拥有自己的上下文,不与其他线程共享。线程上下文机制有不同于其他上下文机制的地方,即线程的生命周期结束后,线程上下文也要回收掉,不然容易出现内存泄露。 ThreadLocal为每一使用该变量的线程都提供了独立副本,可以做到线程间的数据隔离,每个线程都可以访问各自内部的副本变量。使用ThreadLocal的场景有: 在进行对象跨层传递的时候,可以考虑使用,避免方法多次传递,打破层次间的约束。 线程间的数据隔离 进

2023-12-13 10:23:11 250

原创 Guarded Suspension(担保挂起)设计模式

当线程访问某个对象时,发现条件不满足,暂时挂起等待条件满足时再次访问。Guarded Suspension模式是一个非常基础的模式,主要关注(临界值)不满足时将操作的线程正确挂起,以防止出现数据不一致或者操作超过临界值的控制范围。它是很多线程设计模式的基础。

2023-12-13 10:20:39 236

原创 Future设计模式

Future设计模式,针对长时间执行任务场景,提供了一种凭据式解决方案。Future提供了获取计算结果和判断是否完成的两个方法,其中获取计算结果将会导致调用阻塞(在任务未完成的情况下)。

2023-12-13 10:17:23 124

原创 不可变对象设计模式

共享的资源,是指在多个线程同时对其访问的情况下,各个线程都会使其发生变化,线程安全的目的是在受控的并发访问中防止数据发生变化。除了使用synchronized关键字同步对资源的写操作之外,还可以在线程间不共享资源状态,甚至将资源的状态设置为不可变。不可变最核心的地方在于不给外部修改共享资源的机会。

2023-12-13 10:11:05 132

原创 Single Thread Execution设计模式

反之,就是非线程安全的类。子类如果继承了线程安全的类并且打破了Single Thread Execution的方式,就会破坏安全性,这种情况一般称为继承异常。在这个模式中,synchronized关键字起到了决定性的作用,但是排他性是以牺牲性能为代价的,在保证线程安全的前提下,尽量缩小synchronized的作用域。Single Thread Execution模式是指在同一时刻只能有一个线程去访问共享资源,即采用排他方式的操作保证在同一个时刻只能有一个线程访问共享。多个线程对某个类状态发生改变的时候。

2023-12-13 10:08:36 254

原创 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 42

原创 并发包工具类详解

饥饿写是指在使用读写锁的时候,读线程的数量远远大于写线程的数量,导致锁长期被读线程霸占,写线程无法获得锁从而进入饥饿状态。当构造读写锁的时候指定其为公平锁,读写线程获得锁的机会相对公平,但是当读线程远远大于写线程的时候,写线程的效率会比较底下。2、新添加的数据如果超过桶的容量,则请求将被直接拒绝;Monitor工具提供了一种将临界值判断抽取成Guard的处理方式,可以方便地定义若干个Guard也就是临界值的判断,以及对临界值判断的重复使用,除此之外,还具备synchronized和Lock的完整语义。

2023-12-12 13:36:53 45

原创 Java Streams详解

Stream为容器的使用提供了新的方式,允许通过陈述式编码风格对容器中的数据进行分组、过滤、计算、排序、聚合、循环等操作。这里的Stream不是输入输出流,而是Java 8对Collection的一个增强,专注于对集合对象便利又高效的聚合操作,支持串行操作功能,还能借助Fork/Join机制支持并行模式,在多核CPU的环境下,最大程度的来利用CPU超快计算能力。Collector在Stream中主要的用途大致分三项:1、Reduce和Summarizing Stream的元素到一个单一的新输出中;

2023-12-12 13:29:19 40

原创 线程池基本原理与并发包ExecutorService

一个完整的线程池应该具备以下要素: 任务队列:用于缓存提交的任务 线程数量管理功能:一个线程池必须能够很好的管理和控制线程数量,可以通过如下三个参数来实现,初始线程数量、最大线程数量、最低活跃线程数量或核心线程数量 任务拒绝策略:任务数量达到上限且任务队列已满,需要相应的拒绝策略通知任务提交者 线程工厂:用于个性化定制线程 QueueSize:任务队列的最大数量限制 Keepedalive时间:决定线程各个重要参数自动维护的时间间隔 直接使用J

2023-12-12 13:26:19 70

原创 并发包容器详解

CopyOnWrite容器是一种并发容器,简称COW,基本实现思想:在程序运行的初期,所有线程都共享一个数据集合的引用,所有线程对该容器的读取操作将不会对数据集合产生加锁的动作,当有线程对该容器中的数据集合进行删除或增加等写操作时,才会对整个数据集合进行加锁操作,然后将容器中的数据集合复制一份,并且基于最新的复制进行删除或增加等写操作,当写操作执行完毕时,将最新复制的数据集合引用指向原有的数据集合,从而达到读写分离最终一致性的目的。该容器的最大边界是通过构造函数指定的,默认是整型的最大值。

2023-12-12 13:16:37 27

原创 并发包原子类详解

若修改成功返回true。compareAndSet(V expectReference, V newReference, int expectedStamp, int newStamped):与其他原子类型的CAS算法类似,如果引用当前的值、版本号与expect的值、版本号一致,则将引用更新为新的值、版本号。AtomicLong提供了原子操作Long类型数据的解决方案,是Number类的子类,提供的原子性方法在使用习惯上与AtomicInteger非常一致。但是Unsafe使用不当,造成的错误是灾难性的。

2023-12-12 13:14:27 39

原创 线程组、线程切换、线程异常

JVM进程的退出是由于JVM进程中没有活跃的非守护线程,或者收到了系统中断信号,向JVM程序注入一个Hook线程,在JVM进程退出时,Hook线程会启动执行,通过Runtime可以为JVM注入多个Hook线程。中断一个线程组,会导致线程组中所有的活跃线程都被中断。可以设置一个线程组为守护线程组,当线程组中没有任何活跃线程时,守护线程组也会自动销毁。destroy():当线程组中没有活跃线程时,从线程组的父线程组中移除并且销毁。main线程执行结束后,守护线程执行结束,守护线程结束后,钩子线程执行。

2023-12-11 10:04:29 40

原创 定时器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 317

原创 显式锁的使用

Object类的wait方法相当于Condition类的await方法,Object类的notify方法相当于Condition类的signal方法,Object类的notifyAll方法相当于Condition类的signalAll方法。锁Lock分为公平锁和非公平锁,公平锁表示获取锁的顺序是按照线程加锁的顺序来分配的,即FIFO;这个类是读写锁机制,与读操作相关的锁也称为共享锁,与写操作相关的锁也称为排他锁,除了读锁与读锁之间不互斥,其他情况均互斥。isFair方法是判断此lock是不是公平锁。

2023-12-11 09:56:05 23

原创 线程间的通信

notify方法需要在同步区域中调用,在调用时必须获得该对象的对象级别锁,所用是通知哪些等待该对象的对象锁的其他线程,如果有多个线程等待,则由线程规划器随机挑选出其中一个呈现wait状态的线程,对其发出notify,使它获得该对象的对象锁。在执行notify之后,线程不会马上释放锁,wait状态的线程也不能马上获得对象锁,需要等到notify方法的线程推出同步区域后,当前线程才会释放锁,wait状态的线程才可以获得对象锁。在调用wait方法时,线程必须获得该对象的对象级别锁。当线程全部运行结束时移除。

2023-12-11 09:46:55 33

原创 对象和变量的并发访问

synchronized修饰的方法或者代码块为同步区域,在同步区域内使用的共享变量在使用时,会从主存中获取值,离开同步区域时,将值写回到主存中。当一个线程获得一个对象锁之后,再次请求此对象锁时,可以再次获得该对象的锁,即一个synchronized方法或程序块的内部调用本类的其他synchronized方法或程序块,是永远可以得到锁的。当同步区域出现异常时,锁会自动释放掉。atomic是java中的可以同步类,类中的操作可以做到线程安全,当调用原子类中的操作的过程是非线程安全的,有可能会产生脏读的情况。

2023-12-11 09:35:19 23

原创 多线程基本技能

守护线程是一种特殊线程,陪伴其他线程,当其他线程全部关闭后,守护线程才会结束。通常使用线程的默认优先级即可。进程是应用程序的重量级执行单位,线程是进程中任务的轻量级执行单位,进程提供了线程的共享数据和上下文执行环境。thread.setName(String name):在线程启动之前修改线程的name,一般情况下,遵循业务逻辑的需要,都要给线程提供name。Thread类是创建线程的唯一方式,实现线程执行单元有两种方式:重写Thread类的run方法和实现Runnable接口的run方法。

2023-12-11 09:29:52 17

原创 Vue组件的自定义事件$emit

组件上的自定义事件是和组件的自定义属性一样,都是模仿HTML正常的标签,由组件给出事件句柄,由使用组件的父组件提供事件处理函数。组件自定义事件真正触发的地方是在组件模板的标签上,组件自己不提供事件处理函数,将这个处理函数给出一个定义,将这个定义抛给使用组件的父组件,由父组件给出。4、父组件提供事件处理函数可以提供组件自定义事件规定的参数,也可以提供、不提供、提供超过形参个数的参数。3、组件使用时,只有父组件为组件的自定义事件绑定了事件处理函数,组件上事件才会有效果。

2023-11-27 12:52:04 242

原创 Vue组件的自定义属性Props

有属性定义的组件在使用时,属性可以通过静态赋值、动态赋值的方式获得初始化。动态赋值是通过js表达式或者使用组件的父组件定义中给出值,如上的count、show属性属于js表达式动态赋值,list、pfun属性是父组件给出值。从前端组成BOM+DOM+js的组成来看,js是动态性的支持者,DOM是静态性HTML的支持者,vue的组件在动态性上的支持是非常强的,这也带来了组件属性的多种类型和赋值初始化的问题。组件的Props是给父组件使用的,使用时需要明确指定属性的值,或者是在组件定义时,给属性提供默认值。

2023-11-27 12:49:34 204

原创 Vue组件基础

动态组件是利用类似于继承关系的原理,所有的组件都有公共的父类component,所有组件的定义都是component的子类,这样不同组件都是component的子类,所有的子类都是父类型的。比较组件的局部引用和全局引用,局部引用需要明确组件的定义文件位置,全局引用不需要明确组件的定义文件位置,但是需要在使用前有明确的全局注册。组件使用过程中,组件的来源对组件的使用有很大的影响。组件的具备引用方式是组件定义完成后,不注册为Vue的全局对象,使用时需要找到对应的组件定义文件,显示的在使用处注明。

2023-11-25 18:01:26 506

原创 Vue模板引用

模板引用需要在对应的HTML标签上添加 “ref”属性,属性值在组件中需要有对应,这样就可以在组件中使用属性值对模板引用进行操作。由于模板引用在组件中的属性值初始化时为null,在使用时必须先检查模板引用是否已经初始化。当需要对模板引用进行事件操作,如获取焦点、点击等,这需要将模板引用的对象转型为HTMLElement,然后可以调用对应的事件,如focus、click等。Vue的模板引用是为了处理直接访问DOM底层而做的补充处理,毕竟Vue宣称是基于组件的,这种补充处理是对Vue框架的补充。

2023-11-24 10:45:16 105

原创 Vue侦听器

Vue侦听器是根据组件状态做DOM更新或者异步更新其他级联状态的。计算属性的主要目标是根据已有数据计算出组件的状态,它是组件内部的计算,计算结果在组件内部应用。侦听器的主要目标是根据组件状态的变动,做级联的或者异步的操作或DOM更新,操作的影响范围比计算属性大得多。侦听器默认情况下是懒执行、浅层侦听、在Vue组件更新之前被调用的。

2023-11-23 21:21:48 284

原创 Vue表单的整体处理

在前端的处理中,表单的处理永远是占高比例的。在BOM+DOM+js的时候是这样,在Vue的时候也是这样。v-model.lazy :由原来的input事件之后更新v-model的值改为change事件之后更新v-model的值,这对复合组件和计算属性有很大的作用。v-model.number :用户输入的内容会被自动转换为数字,输入框有type="number"时会自动启用。v-model.trim :用户的输入内容会自动去除两端的空格。

2023-11-23 21:19:07 208

原创 Vue事件处理

事件的处理函数除了直接指定处理函数之外,还增加了对事件简易处理函数的内联处理方式。在事件上,Vue增加了事件修饰符,这些事件修饰符极大的丰富了事件处理的效果。Vue又是一种组件式的架构方式,事件和事件处理都是在组件内部进行的,这对事件的管理有很大的改善。.exact :允许控制触发一个事件所需的确定组合的系统按键修饰符。.passive :事件的默认行为将会立即发生而不是等待,一般用于触摸事件的监听器,常用于改善移动设备的滚屏性能。.prevent :阻止事件的默认行为。

2023-11-23 21:16:33 87

原创 Vue条件渲染和列表渲染

Vue中的渲染是对模板的处理。根据BOM+DOM+js的前端组成,Vue的渲染是Vue组件模板根据指令编译,然后挂载到DOM解构中的过程,无论是条件渲染还是列表渲染。v-if:组件会根据v-if的值确定挂载时要不要渲染,如果为false则组件的HTML片段不会进入渲染过程。频繁隐藏/显示切换的HTML片段不适合使用它。v-show:组件挂载时就会渲染,css的dispaly属性会根据v-show的值发生变化,适合频繁隐藏/显示切换的HTML片段。v-for:有多种表现形式,但是有非常标准的推荐格式。

2023-11-15 15:37:03 104

原创 Vue的class、style绑定

当多组件嵌套时,内层组件的样式一定是在外层组件样式的基础上合并计算出来的。回归到BOM+DOM+js的前端,子节点的样式一定是基于父节点的样式上进行生效的。都是HTML的属性,style和class没有什么区别,顶多是style要以对象的形式,class以字符串的方式存在。2、当需要根据响应式状态改变模板中引用的class、style时,需要利用计算属性改变样式的引用。1、当模板直接引用style中定义的样式时,在HTML模板中按照正常的样式引用处理即可。

2023-11-15 15:34:59 143

原创 Vue的计算属性

Vue的计算属性,是一种架构设计中的权衡结果。现在的前端架构,上规模的都是类似于MVVM风格的。在这种架构下,会存在一种情况,从后台取回的数据不能直接展示,需要满足一定条件时做一些临时性的转换,将原本的数据转换成另一种含义的数据才能做展示,转换后的数据仅做业务展示不再继续保存。计算属性是基于组件响应式属性进行数据计算的,结算结果仅做展示。Vue中的组件计算属性是存在get/set方法的,尽量确保get方法中仅仅只是根据响应属性做计算,不要做其他附加操作,如更新DOM、发送数据等。

2023-11-13 19:45:16 185

原创 Vue响应式基础解读

Vue响应式的基础是建立在组件生命周期上的,它基于对组件对象中属性变动的观察,触发组件对应DOM结构的更新。在Vue2.0中,它的实现方式是基于Vue对象属性的get/set方法,当调用Vue对象的set方法时,它会检查对应的属性有没有发生变化,若属性发生变化,Vue会自动更新与这个属性相关的DOM结构。在Vue3.0中,它的实现方式是基于es6 Proxy对象,只要将要动态监控的数据用Proxy对象包装,应用设计模式proxy模式,可以在代理方法调用过程中动态添加一些操作,如级联更新、数据统计等。

2023-11-13 17:30:32 87

转载 Vue模板详解

根据前端是由BOM+DOM+js组成的来看,vue对DOM的操作是将DOM的整体结构设定为单页面结构,每个组件都有自己的template,这段template模板是可以插入文本、HTML片段、HTML属性、js表达式、动态绑定HTML属性和js组件对象属性、指令、修饰符等。Vue支持动态绑定,即HTML标签上的属性名称是动态指定的,动态属性的值只能是字符串或者null。Vue模板方法是一种对HTML片段的操作方法,包括了插入属性值、HTML片段、文本、动态属性、表达式、指令等。也可以动态绑定多个值。

2023-11-13 14:54:35 59

原创 借鉴前端事件机制的Spring AOP

面向切面编程是将前端事件机制迁移到后端的结果。

2022-07-26 16:12:08 186 1

原创 前端框架选型评估

前端框架选型全看业务

2022-07-21 16:01:50 458

原创 从es6到Vue入门

一个拼接怪叫Vue

2022-07-21 15:37:44 431

机器学习的doc

机器学习的文档,可以获得相关的信息,不用到处上网

2011-12-08

SVN乌龟版简装

SVN是开发必备的,没有是不可以的。学着用吧,很简单

2011-11-02

空空如也

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

TA关注的人

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