自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

weixin_37627646的博客

一只大龄程序猿的救赎之路

  • 博客(70)
  • 收藏
  • 关注

转载 Sentinel 与 Hystrix 的对比

SentinelHystrix隔离策略信号量隔离线程池隔离/信号量隔离熔断降级策略基于响应时间或失败比率基于失败比率实时指标实现滑动窗口滑动窗口(基于 RxJava)规则配置支持多种数据源支持多种数据源扩展性多个扩展点插件的形式基于注解的支持支持支持限流基于 QPS,支持基于调用关系的限流不支持流量整形支持慢启动、匀速器模式不支持系统负载保护支持不支持控制台开箱即用,可配置规则、查看秒级监控、机器发现等不完善常见框架的适配。

2023-04-28 17:12:45 890

转载 SpringCloud Gateway

SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

2022-09-01 11:31:12 614

转载 SpringCloudAlibaba——Nacos实现原理详解

在Spring-Cloud-Common包中有一个类org.springframework.cloud. client.serviceregistry .ServiceRegistry ,它是Spring Cloud提供的服务注册的标准。集成到Spring Cloud中实现服务注册的组件,都会实现该接口。从上述代码看,所谓心跳机制就是客户端通过schedule定时向服务端发送一个数据包 ,然后启动-个线程不断检测服务端的回应,如果在设定时间内没有收到服务端的回应,则认为服务器出现了故障。...

2022-08-29 17:52:33 487

转载 微服务:注册中心ZooKeeper、Eureka、Consul 、Nacos对比

服务注册中心本质上是为了解耦服务提供者和服务消费者。对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的。更进一步,为了支持弹性扩缩容特性,一个微服务的提供者的数量和分布往往是动态变化的,也是无法预先确定的。因此,原本在单体应用阶段常用的静态LB机制就不再适用了,需要引入额外的组件来管理微服务提供者的注册与发现,而这个组件就是服务注册中心。...

2022-08-26 17:46:08 293

转载 SpringCloud 简介

​ 随着互联网的发展,用户群体逐渐扩大,网站的流量成倍增长,常规的单体架构已无法满足请求压力和业务的快速迭代,架构的变化势在必行。下面我们就以系统网的架构演进为例,从最开始的单体架构分析,一步步的到现在的微服务架构。...

2022-08-26 17:04:58 181

转载 分布式系统到底是什么

随着大型网站的各种高并发访问、海量数据处理等场景越来越多,如何实现网站的高可用、易伸缩、可扩展、安全等目标就显得越来越重要。为了解决这样一系列问题,大型网站的架构也在不断发展。提高大型网站的高可用架构,不得不提的就是分布式。本文主要简单介绍了分布式系统的概念、分布式系统的特点、常用的分布式方案以及分布式和集群的区别等。...

2022-08-26 11:17:05 1766

转载 什么是MQ?为什么要用MQ?MQ分类、MQ的选择

​MQ(message queue),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了MQ之后,消息发送上游只需要依赖MQ,不用依赖其他服务。...

2022-08-25 19:50:30 3544

转载 Java源码学习之并发编程-锁-ReentrantReadWriteLock

log.debug("获取读锁...");r.lock();try{log.debug("读取");sleep(1);log.debug("释放读锁...");r.unlock();}}log.debug("获取写锁...");w.lock();try{log.debug("写入");sleep(1);log.debug("释放写锁...");w.unlock();}}}测试读锁-读锁可以并发,读锁没有释放时,其他线程就可以获取读锁结果。...

2022-07-20 16:28:56 240

转载 Java源码学习之并发编程-锁-ReentrantLock

NonfairSync类继承了Sync类,表示采用非公平策略获取锁,其实现了Sync类中抽象的lock方法,源码如下从lock方法的源码可知,每一次都尝试获取锁,而并不会按照公平等待的原则进行等待,让等待时间最久的线程获得锁。跟踪lock方法的源码可知,当资源空闲时,它总是会先判断sync队列(AbstractQueuedSynchronizer中的数据结构)是否有等待时间更长的线程,如果存在,则将该线程加入到等待队列的尾部,实现了公平获取原则。所以这块代码是为了解决极端情况下的并发问题。...

2022-07-15 15:54:48 193

转载 Java源码学习之并发编程-锁-Java中8种锁机制

​ 在ReentrantLock中包含了公平锁和非公平锁两种锁。 如果你用默认的构造函数来创建ReentrantLock对象,默认的锁策略就是非公平的。​ 多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。优点:所有的线程都能得到资源,不会饿死在队列中。缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。公平锁图示:图示1: ​ 咱们重新回到第一张图,就是线程1刚刚释放锁之后,线程2还没来得及重新加锁的那个状

2022-07-14 10:24:17 972

转载 Java源码学习之并发编程-锁

前言在前面的章节中我们深入了解了关键字synchronized,其实他可以看成一种可重入锁, 这章开始我们会逐步对锁进行探究内容创作不易,原文: https://mp.weixin.qq.com/s?__biz=MzkwMDE1MzkwNQ==&mid=2247496038&idx=1&sn=10b96d79a1ff5a24c49523cdd2be43a4&source=41#wechat_redirectJava 锁分类Java 中的锁有很多,可以按照不

2022-04-15 14:35:39 224

转载 Java源码学习之关键字-volatile

前言本篇文章将从java内存模型、字节码角度解读volatile,因为jvm屏蔽了系统、硬件的差异,所以从这个角度出发更直观、更易理解;网上不乏从多核cpu多级缓存或cpu lock指令去解读volatile的,私以为这种解读方式有问题,比如单核cpu存在内存可见性问题吗?似乎没有答案。再者,volatile为什么会防止指令重排?仅仅是因为lock指令吗,要知道lock是结果,原因是volatile的可见性及happens-before原则。在介绍volatile之前必须了解java内存模型。java

2022-04-15 11:50:14 196

转载 JAVA源码学习之集合-ConcurrentHashMap

类的描述public class ConcurrentHashMap<K,V>extends AbstractMap<K,V>implements ConcurrentMap<K,V>, Serializable支持检索的完全并发和更新的高预期并发的哈希表。 此类遵循与 Hashtable 相同的功能规范,并包含与 Hashtable 的每个方法对应的方法版本。 但是,即使所有操作都是线程安全的,检索操作也不需要锁定,并且不支持以阻止所有访问的方式锁定整个表

2022-04-01 17:55:10 151

转载 Java源码学习之并发编程-线程池-clt:runState&workCount

ctl:ThreadPoolExecutor用一个AtomicInteger来存储线程池工作状态和工作线程数量。ctl二进制的高三位用来保存线程池工作状态,其余用来保存工作线程数量。private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); // 初始值:状态RUNNINT,工作线程数量:0private static final int COUNT_BITS = Integer.SIZE - 3; // Int

2022-01-25 10:22:24 183

转载 Java源码学习之并发编程-线程池

初识线程池我们知道,线程的创建和销毁都需要映射到操作系统,因此其代价是比较高昂的。出于避免频繁创建、销毁线程以及方便线程管理的需要,线程池应运而生。线程池优势 降低资源消耗:线程池通常会维护一些线程(数量为 corePoolSize),这些线程被重复使用来执行不同的任务,任务完成后不会销毁。在待处理任务量很大的时候,通过对线程资源的复用,避免了线程的频繁创建与销毁,从而降低了系统资源消耗。 提高响应速度:由于线程池维护了一批 alive 状态的线程,当任务到达时,不需要再创建线程,而

2022-01-24 13:13:39 304

转载 Java源码学习之并发编程-多线程(三)-sleep和wait

结合synchronized,会更好的理解sleep()和wait()这两个方法,当然也就知道了他们的区别了。这篇博客就一起学习这两个方法sleep()sleep() 方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争cpu的执行时间。因为sleep() 是static静态的方法,他不能改变对象的机锁,当一个synchronized块中调用了sleep() 方法,线程虽然进入休眠,但是对象的机锁没有被释放,其

2022-01-24 10:57:57 208

转载 Java源码学习之并发编程-多线程(二)

一、概述 当线程被创建以后,它不是一启动(start)就进入运行状态的,也不是一直处于执行状态。在线程的生命周期中,它要经过创建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)这五种状态。当线程进入运行状态后,它不是一直“霸占”CPU运行,一般的操作系统是采用抢占式的方式来让线程获得CPU。所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞、就绪之间切换。二、新建和就绪状态 当程序使用new关键字创建一个线程以后...

2022-01-14 16:54:59 145

原创 Java源码学习之并发编程-多线程(一)

前言Java 中实现多线程的方式有三种,下面我们会详细了解这三种方式正文Thread第一种是线程类继承Thread类, 实现run方法, 然后线程类调用start方法。 线程类启动的时候会执行线程类中run方法public class ThreadDemo extends Thread{ @Override public void run(){ try { sleep(1000); } catch (InterruptedException e) { e.pr.

2022-01-14 13:29:47 188

原创 java 源码学习之并发编程

从这章开始,我准备进入到并发编程的研究,会从 多线程、线程池、线程安全逐步进行研究 ...

2022-01-13 10:26:04 176

转载 Java源码学之关键字-static

static关键字在类中,用static声明的成员变量为静态成员变量,也成为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。这里要强调一下:static修饰的成员变量和方法,从属于类 普通变量和方法从属于对象 静态方法不能调用非静态成员,编译会报错static关键字的用途一句话描述就是:方便在没有创建对象的情况下进行调用(方法/变量)。显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。stat.

2022-01-07 16:33:22 171

转载 Java源码学习之关键字-final研究

final 是Java 中重要关键字之一,可以应用于类、方法以及变量上。这篇文章中将讲解什么是 final 关键字?将变量、方法和类声明为 final 代表了什么?使用 final 的好处是什么?final 关键字是什么?final 在 Java 中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作 final,你将不能改变这个引用了,编译器会检查代码,如果试图将变量再次初始化的话,编译器会报编译错误。final 变量凡是对成员变量或者本地变量(在方法中的或者代码块中

2022-01-05 13:39:04 144

转载 Java源码学习之关键字-深入了解synchronized原理

了解完synchronized的基本含义及其使用方式后,下面我们将进一步深入理解synchronized的底层实现原理。synchronized底层语义原理Java 虚拟机中的同步(Synchronization)基于进入和退出管程(Monitor)对象实现, 无论是显式同步(有明确的 monitorenter 和 monitorexit 指令,即同步代码块)还是隐式同步都是如此。在 Java 语言中,同步用的最多的地方可能是被 synchronized 修饰的同步方法。同步方法 并不是由 mon

2022-01-05 11:08:12 244

原创 JAVA源码学习之集合-Hashtable

类的描述public class Hashtable<K,V>extends Dictionary<K,V>implements Map<K,V>, Cloneable, Serializable此类实现了一个哈希表,它将键映射到值。任何非空对象都可以用作键或值。要成功地从哈希表存储和检索对象,用作键的对象必须实现hashCode方法和equals方法。哈希表的实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的存储桶数,初始容量只是创建

2022-01-04 18:08:13 425

原创 JAVA源码学习之集合-LinkedHashMap

类的描述public class LinkedHashMap<K,V>extends HashMap<K,V>implements Map<K,V>哈希表和链表实现的映射接口,具有可预测的迭代顺序。此实现与HashMap的不同之处在于,它维护一个贯穿其所有条目的双链接列表。此链表定义了迭代顺序,通常是key插入Map的顺序(插入顺序)。请注意,如果将键重新插入Map,则插入顺序不受影响。(如果调用m.put(k,v),而m.containsKey(k)将在调

2021-12-28 14:28:55 555

原创 JAVA源码学习之集合-HashMap(1)

类的描述public class HashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable基于哈希表的 Map接口的实现。这种实现提供了所有可选的Map操作,并允许 null值和 null关键。(这 HashMap类大致相当于 Hashtable,除了它是不同步的,允许空值。)这类做任何保证Map的秩序;特别是,它并不能保证订单将随时间保持恒定。这个..

2021-12-24 17:54:51 396

原创 JAVA源码学习之集合-TreeMap

前言从这章开始我们将进入到集合的最后一个模块, Map, 本章我们开始了解TreeMap正文类的描述public class TreeMap<K,V>extends AbstractMap<K,V>implements NavigableMap<K,V>, Cloneable, Serializable基于 NavigableMap实现红黑树。Map是根据它的键的 natural ordering排序,或通过设置在Map创建时 Comparato

2021-12-23 18:18:03 272

转载 红黑树原理及代码实现

红黑树简介红黑树是一种自平衡的二叉查找树,它的统计性能要优于平衡二叉树,因此在很多地方都有应用,例如Java中的TreeMap,HashMap等数据结构都使用到了红黑树。红黑树对很多人来说熟悉而陌生,熟悉则是因为知道红黑树在很多场景中有使用,但又对其原理很陌生或者一知半解。今天就来剖析一下红黑树原理红黑树是一种二叉查找树,但是它在二叉查找树基础上增加了着色和相关的性质使得其相对平衡,从而保证了红黑树的查找、插入、删除的时间复杂度最坏为O(log n)。红黑树具备以下5个性质:1.每个节点要么是黑色

2021-12-22 15:06:29 345

转载 JAVA源码学习之集合-LinkedTransferQueue

简介LinkedTransferQueue是一个由链表结构组成的无界阻塞TransferQueue队列。相对于其他阻塞队列,LinkedTransferQueue多了tryTransfer和transfer方法。LinkedTransferQueue采用一种预占模式。意思就是消费者线程取元素时,如果队列不为空,则直接取走数据,若队列为空,那就生成一个节点(节点元素为null)入队,然后消费者线...

2021-12-21 16:16:42 148

转载 JAVA源码学习之集合-SynchronousQueue

转载:(2条消息) java并发之SynchronousQueue实现原理_yanyan19880509的专栏-优快云博客_synchronousqueuehttps://blog.youkuaiyun.com/yanyan19880509/article/details/52562039前言SynchronousQueue是一个比较特别的队列,由于在线程池方面有所应用,为了更好的理解线程池的实现原理,笔者花了些时间学习了一下该队列源码(JDK1.8),此队列源码中充斥着大量的CAS语句,理解起来是有些难度的.

2021-12-16 15:23:17 111

原创 JAVA源码学习之集合-PriorityBlockingQueue

类的描述public class PriorityBlockingQueue<E>extends AbstractQueue<E>implements BlockingQueue<E>, Serializable使用与类PriorityQueue相同的排序规则(堆排序)并提供阻塞检索操作的无界阻塞队列。虽然此队列在逻辑上是无界的,但由于资源耗尽(导致OutOfMemoryError),尝试添加可能会失败。此类不允许空元素。依赖于自然顺序的优先级队列也不允..

2021-12-15 19:42:58 680

原创 JAVA源码学习之集合-LinkedBlockingQueue

类的描述public class LinkedBlockingQueue<E>extends AbstractQueue<E>implements BlockingQueue<E>, Serializable基于链接Node的可选有界阻塞队列。该队列对元素进行FIFO排序(先进先出)。队列的头是在队列上停留时间最长的元素。队列的尾部是在队列上停留时间最短的元素。新元素插入到队列的尾部,队列检索操作获取队列头部的元素。链接队列通常比基于阵列的队列具有更高的吞吐

2021-12-15 14:36:26 263

原创 JAVA源码学习之集合-DelayQueue

类的描述public class DelayQueue<E extends Delayed>extends AbstractQueue<E>implements BlockingQueue<E>一种延迟元素的无界阻塞队列,其中一个元素只有在其延迟过期时才能被占用。队列的头是延迟过期时间在过去最长的延迟元素。如果没有延迟过期,则没有head,poll将返回null。当元素的getDelay(TimeUnit.NANOSECONDS)方法返回小于或等于零的值时,

2021-12-14 17:52:46 103

原创 JAVA源码学习之集合-ArrayBlockingQueue

前言从这章开始我们就正式的进入到了BolckingQueue的篇章正文类的描述public class ArrayBlockingQueue<E>extends AbstractQueue<E>implements BlockingQueue<E>, Serializable通过数组实现的一个有界blockingQueue。这个队列的命令元素的FIFO(先进先出)。队列的头是已在队列中的元素,是最长的时间。队列的尾部是已在队列中的元素最短的时

2021-12-14 16:04:56 474

原创 JAVA源码学习之集合-ArrayDeque

类的描述 public class ArrayDeque<E>extends AbstractCollection<E>implements Deque<E>, Cloneable, Serializable 通过可调整大小的数组实现Deque的接口。阵列的双端队列没有容量限制;它们根据需要增长以支持使用。他们不是线程安全的;;在没有外部同步的情况下,它们不支持多线程并发访问。禁止空元素。这个类在用作堆栈时可能比 Stack 更快,当用作队列时比 Linke

2021-12-13 13:35:07 175

原创 JAVA源码学习之集合-ConcurrentLinkedDeque

前言上一章我们讲了ConcurrentLinkedQueue, 这章我们要讲ConcurrentLinkedDeque通过类的名字上看,通过名字,我猜想基本原理应该和ConcurrentLinkedQueue是一样的,除了数据结构式双向链表以外,下面就具体研究,来看下自己的猜想是不是正确的正文类的描述 public class ConcurrentLinkedDeque<E>extends AbstractCollection<E>implements Deq

2021-12-03 16:17:06 774

原创 JAVA源码学习之集合-ConcurrentLinkedQueue

类的描述public class ConcurrentLinkedQueue<E>extends AbstractQueue<E>implements Queue<E>, Serializable 一个基于链表的无界线程安全队列。此队列对元素 FIFO(先进先出)进行排序。队列的头部是在队列中停留时间最长的那个元素。队列的尾部是在队列中停留时间最短的那个元素。新元素插入队列尾部,队列检索操作获取队列头部元素。当许多线程将共享对公共集合的访问时, Co...

2021-12-02 16:10:09 352

原创 JAVA源码学习之集合-PriorityQueue

类的描述 public class PriorityQueue<E>extends AbstractQueue<E>implements Serializable 基于优先级堆的无界优先级队列。优先级队列的元素根据它们的自然顺序进行排序,或者由队列构建时提供的 Comparator 排序,具体取决于使用的构造函数。优先级队列不允许空元素。依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致 ClassCastException)。 ...

2021-11-19 14:42:43 425

原创 JAVA源码学习之集合-队列

前言collection下的List和set我们在前面的几章都讲过了,下面我们去研究,collection下最神秘的,最不常用的Queue正文类的描述compact1, compact2, compact3java.utilInterface Queue<E> 参数类型 E -元素举行此集合中的类型 All Superinterfaces: Collection , Iterable All Known Subinterfaces: Blocki

2021-11-17 15:32:24 598

原创 JAVA源码学习之集合-Set总结

前言前面几章我们研究了,Set的三个实现类,这章我们做下对比正文相同点HashSet、LinkHashSet、TreeSet都是通过Map的实现类来实现的,不可重复的能力, 是根据相关Map实现类的key不可重复来实现的, 相关的方法都是通过Map实现类来实现的不同点HashSet和TreeSet区别1. HashSet是基于HashMap实现的, TreeSet是基于TreeMap实现的2. HashSet的key可以允许null, TreeSet的key不可以为n

2021-11-16 18:11:34 418

原创 JAVA源码学习之集合-TreeSet

前言研究完了,HashSet和LinkHashSet,那么TreeSet当然也是不能错过的了。这章我们就一起研究下TreeSet的源码正文类的描述public class TreeSet<E>extends AbstractSet<E>implements NavigableSet<E>, Cloneable, SerializableTreeMap 是基于NavigableSet实现的。元素使用其自然顺序排序,或由 Comparator在设..

2021-11-16 17:55:21 467

空空如也

空空如也

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

TA关注的人

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