自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 kafka

消息的消费者的消费速度远赶不上生产者生产消息的速度,就会导致kafka中大量数据没有被消费,当消息堆积雨来越多,会导致消费者寻址的性能越来越差,从而造成kafka性能降低,导致其他服务的访问性能也变慢,造成服务雪崩。如果多个消费者在一个消费组中,那么只有一个消费者可以收到订阅的topic中的消息,换言之,同一个消费组只能有一个消费者收到一个topic中的消息,在创建消费客户端时通过指定消费组的id来控制消费端属于哪个消费组。Kafka集群中的broker在zk中创建临时序号结点,序号最小的结点(即。

2022-11-05 19:18:34 995 1

原创 多线程设计模式

线程T1需要终止线程T2时,如果使用stop方法直接终止线程T2,T2申请的锁得不到释放;因此使用两阶段终止模式更加优雅。

2022-10-22 13:01:41 363

原创 线程安全集合类

且JDK7中的扩容后的rehash操作是直接在原数组上进行的,当两个线程同时扩容时,假设链表:a-b-c-null,线程1在rehash时会将尾部结点插在头部,变为:c-a-b-null,假设本来此时线程2已经到了c,接下来到null就结束循环,但由于线程1的影响导致c.next变为a所以会继续循环,同理线程1也会收到线程2的影响进入死循环。实现了懒惰初始化,在构造器中仅仅计算了table的大小,并没有初始化table,在第一次使用的时候才会真正的创建。,使用一个Dummy结点来占位,item为null。

2022-10-20 11:43:58 2422

原创 JUC下的并发工具

Exchanger是一个用于线程间写作的工具类,进行线程间的数据交换。他提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。

2022-10-12 20:57:41 250

原创 线程池

**** @Description 自定义线程池// 如果队列已满,则死等队列有空闲 RejectPolicy < Runnable > alwaysWait =(queue , task) -> {};// 如果队列已满,则等待1s RejectPolicy < Runnable > waitSec =(queue , task) -> {};// 如果队列已满,则放弃入队 RejectPolicy < Runnable > giveUp =(queue , task) -> {};

2022-10-11 16:42:30 843 2

原创 JUC下的锁

**** @Description 自定义锁,不可重入、独占锁/**** 独占锁,同步器类/*** 尝试加锁* @param arg 定义可重入锁时使用到该参数* @return// 通过cas对state进行修改,cas锁的形式实现独占锁 if(compareAndSetState(0 , 1)) {// 如果cas修改成功,即加锁成功,将Owner设置为当前线程 setExclusiveOwnerThread(Thread . currentThread());} /**

2022-10-08 17:53:58 194

原创 不可变与无状态

SimpleDateFormat是作日期字符串格式化转换的类,,在多线程场景会出现问题或者使用DateTimeFormat类,这个类底层就是不可变的,即状态无法被修改,所以是线程安全的。

2022-10-04 14:15:58 442

原创 无锁并发-CAS与原子类

add方法主要做了对无竞争时使用base进行累加,和对已经创建Cell的线程进行累加操作,在累加的cas操作失败时,表示出现了竞争,则进入longAccumulate方法创建Cell。AtomicMarkableReference只使用一个布尔值做一个标记,可以用来保证某个操作只进行一次,当标记发生改变时,就不再进行操作,他不会统计改变的次数,而只是检测是否改变。,内部方法基本相同,内部提供了部分已经封装好的方法供开发者使用,同时也可以使用提供的CAS方法来自己实现CAS操作。

2022-10-03 23:24:56 417

原创 阻塞悲观锁-synchronized

mavenlogback.xml线程安全问题一个程序运行多个线程本身是没有问题的,问题出现在多个线程访问共享资源(多个线程对共享资源读写操作时发生指令交错),一段代码内如果存在对共享资源的多线程读写操作,这段程序称为临界区多个线程在临界区执行,由于代码的执行序列不同而导致结果无法预测,称之为发生了竞态条件预期结果为10000,实际结果为6979synchronized是阻塞式的解决方案,俗称对象锁,他会采用互斥的方式让同一时刻至多只有一个线程能持有对象锁,其他线程再想获取这个对象锁就会被阻

2022-10-02 20:37:54 871

原创 LinkedList源码分析

三个属性都用transient修饰了,说明内部对序列化有自己的实现,而不是直接使用ObjectOutputStream中的序列化方法,直接序列化是无法序列化整个链表的,需要遍历链表。

2022-09-28 17:58:04 162

原创 Java多线程基础

mavenlogback.xml线程的创建直接创建Thread将线程(Thread)与可执行任务(Runnable)解耦,提高灵活性Thread和Runnable的关系FutureTask是Runnable子类(FutureRunnable)的子类可以接收Callable类型的参数,是对Runnable的扩展,可以用来获取任务的执行结果Java方法的运行是基于JVM栈的,每个线程启动时,JVM就会给它分配一块栈内存因为一些原因导致cpu不再执行当前线程没转而执行另一个线程,就会发生线程上下文

2022-09-27 13:54:31 306

原创 ArrayList源码解析

ArrayList中定义了两个内部迭代器类:Itr、ListItr,其中Itr实现了Iterator接口,ListItr是Itr的子类。这是ArrayList从AbstarctList继承来的属性,表示结构变化次数,每次扩容、删除等都会引起modCount的改变,ArrayList中还有一个内部类SubList,用于从ArrayList中截取部分子视图。因为ArrayList底层使用的是Object数组,所以这里将数组转成Object类型。通过空参构造器创建的ArrayList底层是一个空数组,

2022-09-25 20:33:26 354

原创 多线程基本概念

不需要等待结果返回,就能继续运行就是异步。:需要等待结果返回,才能继续运行就是同步。:同一个时间段,多个线程串行执行;:同一时刻,多个线程同时执行;

2022-09-24 10:45:25 233

原创 CAS与锁优化

CAS即**compare and swap**,它体现一种**乐观锁(假设不会有其他线程影响当前线程操作,如果发现其他线程影响了当前线程的操作,就回滚当前线程,重新执行)**的思想,比如多个线程要对一个共享整型变量执行+1操作:

2022-09-23 11:53:42 239

原创 Java内存模型——JMM

大致可以认为,基本数据类型的访问,读写都是具备原子性的(除了long、double这两个64位的类型,在运算时会被分成两个32位进行运算);如果锁住的是对象,则会通过monitorenter和monitorexit指令;如果锁住的是方法,则会通过ACC_SYCHRONIZED标识。:JIT编译器在运行时的一些优化,如果一段代码执行的先后顺序对执行结果不会有影响时,代码可能不会按照源码顺序进行执行;happens-before规定了哪些写操作对其他线程的读操作可见,它是可见性和有序性的一套规则总结。

2022-09-21 15:51:59 210

原创 Java类加载

应用场景想加载非classpath随意路径中的类文件都是通过接口来实现,希望解耦时,常用在框架设计这些类希望予以隔离,不同应用的同名类都可以加载,不冲突,常用于tomcat容器步骤继承ClassLoader父类要遵从双亲委派机制,重写findClass方法(在jdk1.2之前没有双亲委派机制,所以都去重写的loadClass方法,导致破坏了双亲委派机制,为了兼容以前的代码,不能禁止重写loadClass方法,现在写要注意重写findClass方法而不是loadClass方法)

2022-09-20 21:26:53 251

原创 语法糖

Java泛型是1.5引入的新特性,可以通过泛型来表示任意的类型,提高代码的复用性;但是泛型是不会保留到运行期的,在编译期,编译器就会对泛型进行擦除;这个特性是jdk5开始加入的,对每个基本数据类型所对应的包装类的转换提供便利,编译器会自动生成调用valueOf方法的代码来进行转换。jdk开始,新增了堆需要关闭的资源处理的特殊语法,即try-with-resources;一个类没有写构造方法时,会有一个默认的无参构造方法,这是编译器帮我们加上的。jdk5引入,遍历数组、集合时,可以通过foreach的方式。

2022-09-18 21:56:42 530

原创 垃圾回收机制

在对象中加入一个计数,表示这个对象被引用的数量,每当一个新的引用指向对象,引用计数+1,一个引用不再指向对象,引用计数-1;当这个引用计数为0的时候,没有引用指向这个对象了,这个对象就是垃圾。

2022-09-17 20:07:52 336

原创 直接内存

使用了Unsafe对象完成直接内存的分配和回收,并且回收需要主动调用freeMemory方法ByteBuffer的实现类内部,使用了Cleaner(虚引用)来检测ByteBuffer对象,一旦ByteBuffer对象被垃圾回收,那么就会由ReferenceHandler线程通过Cleaner的clean方法调用freeMemory来释放直接内存。

2022-09-15 15:37:51 188

原创 字符串常量池-StringTable

常量池中的字符串仅仅是符号,在第一次用到时,才会变为对象StringTable利用串池的机制,来避免重复创建字符串对象字符串变量的拼接原理是StringBuilder构建字符串常量的拼接原理是编译期优化可以使用intern方法,主动将串池中还没有的字符串对象放入串池。

2022-09-14 15:44:33 911

原创 JVM内存结构

Program Counter Register——程序计数器,在字节码执行过程中,

2022-09-11 21:48:57 302

原创 职责链模式

职责链模式,又称责任链模式;为请求创建了一个接收者对象的链。这种模式对请求的发送者和接收者进行解耦职责链模式通常每个接收者都包含对另一个接收者的引用,如果档期那接收者不能处理,就将请求交给下一个接收者处理职责链模式属于行为型模式将请求和处理分开,实现解耦,提高系统的灵活性简化了对象,对象不需要知道链的结构。...

2022-09-01 10:52:36 129

原创 策略模式

策略模式定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的用户第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类;第三、多用聚合少用继承策略模式的关键是项目中的变化部分和不变的部分策略模式的核心思想是:多用组合/聚合,少用继承;用行为类组合,而不是行为的继承。更有弹性体现了开闭原则,客户端增加行为不修改原有代码,只需要添加一种策略或行为即可,避免了多重的if-else提供了可以替换继承关系的方法,用策略将行为单独提取出来,使用聚合代替继承。...

2022-08-31 11:39:36 97

原创 状态模式

状态模式主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题,状态和行为是一一对应的,状态之间可以相互转换当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了类状态模式的代码具有很强的可读性,状态模式将每个状态的行为封装到对应的一个类中方便维护,将容易长生问题的if-else语句删除了,如果把每个状态的行为都放到一个类中,每次调用方法都要判断当前是什么状态,不但会产出很多的if-else语句,而且容易出错符合开闭原则,容易增删状态。...

2022-08-30 13:14:59 137

原创 备忘录模式

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态备忘录模式属于行为型模式备忘录模式提供了一种状态恢复机制,可以使用户能够比较方便的回到某个历史状态实现了信息的封装,使得用户不需要关心状态的保存细节如果类的成员变量较多,势必会占用比较大的资源,而且保存一次都会消耗一定的内存适合的场景:游戏存档、windows中ctrl+z、浏览器的回退、数据库的事务管理为了节省内存,可以和原型模式配合使用。...

2022-08-29 16:40:56 784

原创 中介者模式

中介者模式,用一个中介对象来封装一系列的对象交互,中介者使各个对象之间不需要显式的相互引用,从而使其松耦合,可以独立地改变他们之间的交互中介者模式属于行为型模式,使代码松耦合,提高扩展性和维护性比如MVC模式,C就是M和V的中介者,C负责所有调用的控制,在前后端之间起到了中间人的作用多个类相互耦合,会形成网状结构,使用中介者模式将网状结构分离为星型结构,松耦合减少类间依赖,降低了耦合,符合迪米特法则中介者承担了较多的责任,一旦中介者出现了问题,整个系统都会受影响。...

2022-08-26 15:40:16 120

原创 观察者模式

新增一个第三方,都需要创建一个新的第三方对象,并加入都dataChange中,不利于维护,也不是动态加入。jdk中Observeable类,使用了观察者模式。

2022-08-25 14:34:41 251

原创 迭代器模式

优点提供了一个统一的方法遍历对象那个,客户不用再考虑集合类型隐藏了集合的内部结构,客户端要遍历集合是只需要取到迭代器,不用知道内部组成提供了一种设计思想,一个类应该只有一个引起变化的原因,再集合类中吧迭代器分开,就是把管理对象集合和遍历对象集合的责任分开缺点每个聚合对象都要一个迭代器,会产生多个迭代器类。

2022-08-19 17:45:19 138

原创 访问者模式

访问者模式封装了一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新操作主要将数据结构和数据操作分离,解决数据结构和操作耦合性问题访问者模式的基本工作原理是:在被访问的类里面加一个对外提供接待访问者的接口访问者模式的主要应用场景是:需要对一个对象结构中的对象进行很多不同的操作,同时避免这些操作污染这些对象的类,将类结构和操作分离访问者模式符合单一职责原则,让程序具有优秀的扩展性,灵活性非常高访问者模式可以对功能尽心过统一,可以作报表、UI、拦截器、过滤器,...

2022-08-17 17:13:06 123

原创 命令模式

在软件设计中,经常需要向某些对象发送请求,但并不知道请求的具体接收者是谁,也不知道被请求的操作是哪个,只需要在程序运行时指定具体的接收者即可命令模式使得请求发送者和请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦在命令模式中,会将请求为一个对象,以便使用不同参数来标识不同的请求,同时命令支持可撤销的操作。...

2022-08-16 14:27:49 93

原创 模板方法模式

在抽象类中公开定义了执行它的方法的模板,子类可以按需要重写方法实习那,但调用将以抽象类中定义的方式进行简单的说,模板方法模式定义了一个操作中算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构,就可以重定义该算法某些特定步骤模板方法模式属于行为型模式。...

2022-08-14 17:19:10 172

原创 代理模式

防火墙代理:内网通过代理穿透防火墙,实现对公网的访问缓存代理:比如当请求图片文件等资源,先缓存代理取,如果取到资源则ok,取不到再由代理到公网或者数据库取然后缓存远程代理:远程对象的本地代表,通过它可以把远程对象当作本地对象来调用,远程代理通过网络和真正的远程对象沟通信息同步代理:主要在多线程编程中,完成多线程之间的同步工作。...

2022-08-13 15:05:14 119

原创 享元模式

享元模式也叫蝇量模式,是运用共享技术有效的支持大量细粒度的对象常用于系统底层开发,解决系统的性能问题,像数据库连接池,里面都是创建好的连接对象,caller需要使用的时候直接拿来用,避免重新创建,在没有我们需要的对象的时候,就重新创建一个享元模式能够解决重复对象的内存浪费问题,当系统中有大量相似的对象,需要缓冲池时。不需要总是创建新对象,可以从缓冲池里面拿,这样可以降低系统内存,同时提高效率享元模式的经典应用场景就是池技术。...

2022-08-12 15:25:11 89

原创 外观模式

外观模式也叫过程模式,外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而不用关心这个子系统的内部细节外观模式对外屏蔽了系统的细节,因此外观模式降低了客户端对子系统使用的复杂性外观模式降低了客户端与子系统的耦合关系,让子系统内部的模块更易维护和扩展通过合理的使用外观模式,可以更好的划分访问层次。...

2022-08-11 20:18:42 86

原创 组合模式

组合模式,又叫部分整体模式,他创建了对象组的树形结构,将对象那个组合成树状结构以表示整体-部分的层次关系组合模式依据树形结构来组合对象,用来表示部分以及整体层次组合模式数据结构型模式组合模式使得用户对单个对象和组合对象的访问具有一致性,即组合能让客户以一直的方式处理个别对象以及组合对象简化了caller的操作,caller只需要面对一致的对象而不用考虑整体部分或者结点叶子的问题具有较强的扩展性,当需要更改组合对象时,只需要调整内部的层次关系,caller不用做出任何改动,符合开闭原则。...

2022-08-10 16:20:10 105

原创 装饰者模式

装饰者模式能够动态的将新的功能附加到对象上,在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则装饰者模式装饰者模式就像打包一个快递,其中包含主体(即打包的物品);以及包装(快递包装外壳);一个主体可以由多个包装嵌套装饰。...

2022-08-07 19:42:32 79

原创 桥接模式

桥接模式是指,将实现与抽象放在两个不同的类层次中,是两个层次可以独立改变桥接模式是一种结构性模式桥接模式基于类的最小设计原则,通过使用封装、聚合以及继承等行为让不同的类承担不同的职责,它的主要特点是把抽象与行为实现分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展桥接模式实现了抽象和实现的分离,从而极大的提高了系统的灵活性,让抽象部分和实习那部分独立开,有助于系统进行分层设计,产生更好的结构化系统。...

2022-08-06 16:23:39 105

原创 适配器模式

适配器模式分为三类,是根据src是以怎样的形式给到Adapter来命名的类适配器:以类给到,在Adapter将src当作类,继承;对象适配器:以对象给到,在Adapter将src作为一个对象,持有;接口适配器:以接口给到,在Adapter,将src作为一个接口,实现Adapter模式最大的作用还是将原本不兼容的接口融合在一起工作。...

2022-08-04 19:58:38 87

原创 建造者模式

建造者模式又叫生成器模式,是一种对象构建模式。他可以将复杂对象的构建过程抽象出来,是这个抽象过程的不同实现方式可以构造出不同表现的对象建造者模式是一步步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以和构建他们,不用关注内部的构建细节客户端不必知道产品内部组成的细节,将产品本身和产品的创建过程解耦,是的相同的创建过程可以创建不同的产品对象。...

2022-08-03 20:28:46 96

原创 原型模式

原型模式是指用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象原型模式是一种创建型模式,允许一个对象再创建一个可定制的对象,无需知道创建的细节工作原理通过一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝他们自己来实施创建。...

2022-07-31 14:49:09 155

空空如也

空空如也

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

TA关注的人

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