自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何让多线程步调一致?

CountDownLatch和CyclicBarrier是Java并发包提供的两个非常应用的线程同步工具类,这两个工具类的用法区别在这里还是有必要再强调一下的。CountDownLatch主要用于解决一个线程等待多个线程的场景可以类比于旅游团长要等待所有的旅客到齐才能去下一个景点,而CyclicBarrier是一组线程之间互相等待,更像是几个驴友之间的不离不弃。

2023-08-18 22:29:53 261

原创 有没有比读写锁更快的锁

StampLock的使用看上去有点复杂,但是如果你能理解乐观所背后的原理,使用起来还是比较流畅的。

2023-08-17 22:33:29 273

原创 如何快速实现一个限流器

信号量在Java语言里面的名气并不算大,但是在其他语言里却很有知名度。Java在并发编程领域走的很快,重点支持的还是管程模型。管程模型理论上解决了信号量模型的一些不足,主要体现在易用性和工程化方面。

2023-08-14 22:39:22 236

原创 Dubbo如何用管程实现异步转同步

Lock & condition是管程的一种实现,所以能否用好lock和condition,要看你对管程模型理解怎么样。管程的技术前面我们已经专门写了一篇文章做介绍,你可以结合着来学,理论联系实践也更有助于加深理解。

2023-08-12 00:04:02 231

原创 隐藏在并发包中的管程

如果你细心观察,会发现我们创建的锁的具体类名是ReentrantLock,这个翻译过来叫做可重入锁,这个概念前面我们一直没有介绍过。所谓可重入锁,顾名思义指的是线程可以重复的获取同一把锁,如下面代码中。当线程T1执行到①处时,已经获取到了rtl,当在①处调用get方法时,会在②再次对所rtl执行加锁操作,此时如果。锁rtl是可重入的,那么线程T1可以再次加锁成功。如果锁rtl是不可重入的,那么线程T1此时会被阻塞。除了可重入锁,你可能还听过可重入函数,可重入函数怎么理解呢?

2023-08-11 21:02:32 49

原创 如何运用面向对象思想写好并发程序

利用面向对象思想编程编写并发程序一个关键点就是利用面向对象里的封装特性。由于篇幅原因,这里我只做了简单的介绍,详细你可以再借助相关资料进行定向学习。

2023-08-08 22:16:35 76

原创 为什么局部变量是线程安全的

调用栈是一个通用的计算机概念,所有的编程语言都会涉及到。Java调用栈相关的知识我并没有花费很大力气去深究,但是靠着那点C语言的知识稍微思考一下,基本上也就推断出来了。

2023-08-07 22:51:37 61

原创 创建多少线程才是合适的?

很多人都知道线程数不是越多越好,但是设置多少是合适的却又拿不定主意,其实只要把握一条原则就可以了,这条原则就是将硬件的性能发挥到极致。上面我们针对CPU密集型和I/O密集型计算场景都给出了理论上的最佳公式,这些公式背后的目标就是将硬件的性能发挥到极致。

2023-08-06 12:42:02 152

原创 Java线程的生命周期

理解Java线程的各种状态以及生命周期对于诊断多线程bug非常有帮助。多线程程序很难调试,出了bug基本上都是靠日志,靠线程dump来跟踪问题。分析线程dump的一个基本功就是分析线程状态,大部分的死锁、饥饿、活锁问题都是需要跟踪分析线程的状态,同时本文介绍的线程生命周期具有很强的通用性。对于学习其他语言的多线程编程也有很大帮助。

2023-08-04 23:13:12 71

原创 管程,并发编程的万能钥匙

不知道你是否曾考虑过这个问题:为什么Java在1.5之前仅仅提供了synchronized关键字及wait() notify() notifyAll()这三个看似从天而降的方法?在刚接触Java的时候,我以为它会提供信号量这种编程原语。因为操作系统原理课程告诉我用信号量能解决所有的并发问题,结果我发现不是。后来我找到了原因,Java采用的是管程技术,synchronized关键字及wait() notify() notifyAll()这三个方法都是管程的组成部分,而管程和信号量是等价的。

2023-08-03 23:04:00 63

原创 安全性、活跃性以及性能问题

并发编程是一个复杂的领技术领域,微观上涉及到了原子性问题、可见性问题和有序性问题,宏观则表现为安全性、活跃性以及性能问题。我们在设计并发程序的时候,主要是从宏观出发,也就是关注它的安全性、活跃性以及性能。安全性方面主要要注意数据竞争和竞态条件。活跃性方面需要注意死锁、活索、饥饿等问题。性能方面我们虽然介绍了两个方案,但是遇到具体问题还是要具体分析,根据特定的场景选择合适的数据结构和算法。

2023-08-02 21:13:38 58

原创 用“等待-通知“机制优化循环等待

等待-通知机制是一种非常普遍的线程间协作方式,工作中经常看到有同学使用轮询的方式来等待某个状态,很其实很多情况下都可以用我们今天的等待通知机制来优化。Java语言内置的synchronized配合wait() notify() notifyAll()这三个方法可以快速的实现这种机制,但它们的使用看上去还是有点复杂,所以你需要认真理解等待队列和wait() notify() notifyAll()的关系,最好用现实世界做个类比,这样有助于你的理解。

2023-08-01 22:42:50 49

原创 遇到死锁怎么办

当我们在编程世界里遇到问题时,应不局限于当下,可以换个思路向现实世界要答案,利用现实世界的模型来构思解决方案,这样往往能够让我们的方案更容易理解,也更能够看清楚问题的本质。但现实世界的模型有些细节往往会被我们忽略,因为在现实世界里,人太智能了,以至于有些细节显得不太重要。在转账模型中,我们为什么会忽视死锁的问题呢?主要是在现实世界中我们会交流。而且会很智能的交流,在编程世界里,两个线程是不会智能的交流的,所以在利用现实模型建模时,我们还要仔细比对现实世界和编程世界里的各个角色之间的差异。

2023-07-31 23:20:18 47

原创 互斥锁之如何用一把锁保护多个资源?

相信看完这篇文章,对于如何用一个锁保护多个资源就很有心得了,它的关键就是要分析多个资源之间的关系。如果资源之间没有关系,那就很好处理。每个资源一把锁就可以了,如果资源之间有关系,就要选择一个粒度更大的锁,这个锁能够覆盖所有相关的资源。除此之外,还要梳理出有哪些访问路径,所有访问路径都要设置合适的锁,这个过程可以类比一下门票管理。原子性的本质是什么?其实就是不可分割。不可分割只是外在的表现,其本质是多个资源间有一致性的,要求操作的中间状态对外不可见。

2023-07-27 23:16:39 90

原创 互斥锁:解决原子性问题

互斥锁,在并发领域的知名度极高,只要有了并发问题,大家首先容易想到的就是加锁,因为大家都知道加锁能够保证执行临界区代码的互斥性。这样理解虽然正确,但却不能够知道你真正用好互斥锁。临界区的代码是操作受保护资源的路径,类似于球场的入口,入口一定要检票,也就是要加锁,但不是随便一把锁都能有效,所以必须深入分析锁定的对象和受保护资源的关系,综合考虑受保护资源的访问路径,多方考量才能用好互斥锁。

2023-07-25 22:53:34 62

原创 Java内存模型

我们在上期聊到了导致可见性的原因是缓存,导致有序性的原因是编译优化,那么解决可见性、有序性的最直接的方法就是禁用缓存和编译优化。但是这样问题虽然解决了,但是我们的性能就堪忧了。那么较为合理的方案就是按需禁用缓存以及编译优化。但是如何做到按需禁用呢?对于并发程序核实禁用缓存以及编译优化只有程序员知道,那所谓按需禁用其实就是按照程序员的要求来禁用。所以,为了解决可见性和有序性的问题,只需要提供给程序员按需禁用缓存和编译优化的方法即可。

2023-07-23 13:24:33 54

原创 可见性,原子性,有序性问题

只有深刻理解可见性、原子性、有序性在并发场景下的原理,才能理解许多并发bug的产生。

2023-07-20 23:47:10 70

原创 断点续传实现

断点续传什么是断点续传具体实现本文使用go语言来实现对断点续传功能什么是断点续传其本质即在对文件的io操作中突然发生某种意外导致io操作中断,本处使用一个temp文件来记录文件传输过程中光标的位置,从而实现断点续传具体实现package mainimport ( "fmt" "io" "log" "os" "strconv")/*主要实现文件断点续传的功能,通过一个temp文件来记录当前传输的位置,在异常中断之后可以通过读取temp文件来继续上一次的文件读写任务 */f

2021-06-24 09:20:41 382

转载 分布式存储Ceph技术

分布式存储ceph技术目录分布式存储ceph技术分布式存储什么是分布式存储分布式存储的特性分布式存储什么是分布式存储分布式存储系统,是通过网络将数据分散存储在多台独立的设备上。分布式存储的特性分布式存储系统可以扩展到几百台甚至几千台的集群规模,而且随着集群规模的增长,系统整体性能表现为线性增长。分布式存储的水平扩展有以下几个特性:...

2021-04-22 13:37:47 727

转载 redis

redis@[Mr_Wzzzz]记录redis的学习,主要参考B站UP主:狂神说目录redis@[Mr_Wzzzz]Nosql概述什么是NosqlNosql的特点redis概述redis的特性redis基础知识redis五大数据类型Nosql概述1、单机Mysql时代90年代,一个网站的访问量一般不会太大,单个数据库完全够用。随着用户增多,网站出现以下问题数据量增加到一定程度,单机数据库就放不下了数据的索引(B+ Tree),一个机器内存也存放不下访问量变大后(读写混合),一台服务器

2021-04-21 17:34:44 66

转载 Linux操作系统

Linux操作系统@[Mr_Wzzzz]本文章为B站UP主狂神说的学习记录目录Linux操作系统@[Mr_Wzzzz]Linux简介环境搭建安装CentOS(虚拟机安装,耗资源)购买云服务器(推荐)Linux目录结构Linux基本的常用命令基本属性Linux简介Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX(可移植操作系统接口) 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。

2021-04-21 09:07:05 79

原创 双向链表

双向链表@[Mr_Wzzzz]目录双向链表@[Mr_Wzzzz]双向链表分析结构图代码实现双向链表分析单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除时,节点总是找到 temp,temp 是待删除节点的前一个节点结构图代码实现...

2021-04-12 21:44:16 63

原创 链表

链表@[Mr_Wzzzz]目录链表@[Mr_Wzzzz]链表的介绍单链表的代码实现链表的介绍链表是一个有序结构,其在内存中的存储如下图所示:链表是以节点的方式来存储,是链式存储每个节点包含 data 域, next 域:指向下一个节点.如图:发现链表的各个节点不一定是连续存储.链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定单链表(带头结点) 逻辑结构示意图如下:单链表的代码实现此处我们选择带头节点的单向链表来进行对水浒英雄的管理(增删改查),所以首先创建一个类如下

2021-03-25 12:07:04 58

原创 队列

队列@[Mr_Wzzzz]目录队列@[Mr_Wzzzz]队列介绍模拟思路代码实现队列介绍队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出示意图:(使用数组模拟队列示意图)模拟思路队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如上图, 其中 maxSize 是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front 及 rear 分别记录队列前后端的下标,front

2021-03-24 18:54:36 73

原创 环形队列

环形队列@[Mr_Wzzzz]目录环形队列@[Mr_Wzzzz]介绍思路代码实现介绍环形队列是为了解决队列无法复用问题而产生的,其主要的思想就是通过某种特定的算法从而达到队列复用的目的,本片文章主要介绍了通过取模运算达到队列复用。思路front 变量的含义做一个调整: front 就指向队列的第一个元素, 也就是说 arr[front] 就是队列的第一个元素front 的初始值 = 0rear 变量的含义做一个调整:rear 指向队列的最后一个元素的后一个位置. 因为希望空出一个空间做为约

2021-03-24 18:53:16 435 1

原创 SpringCloud Bus

SpringCloud Bus@[Mr_Wzzzz]目录SpringCloud Bus@[Mr_Wzzzz]概述什么是总线SpringCloud Bus动态刷新全局广播配置SpringCloud Bus动态刷新定点通知概述用SpringCloud Config时,我们可以实现配置信息手动的动态刷新,也就是远端配置信息发生改变后,需要告诉服务端配置信息发生变化后,服务端才会更新配置信息,而现在我们想要实现分布式自动刷新配置信息功能,这就需要我们使用SpringCloud Bus消息总线配合SpringC

2021-03-24 10:54:41 117

原创 Spring Cloud Config

SpringCloud Config@[Mr_Wzzzz]目录SpringCloud Config@[Mr_Wzzzz]概述服务器端配置客户端配置进行动态刷新概述  在微服务体系的构建中,我们需要给每个微服务都进行config配置,这即造成了代码的冗余又不利于后期的维护,因此我们引入了SpringCloud Config来进行全局的配置管理。  SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。Sp

2021-03-23 17:39:47 62

原创 稀疏数组

稀疏数组@[Mr_Wzzzz]目录稀疏数组@[Mr_Wzzzz]基本介绍二维数组 转 稀疏数组的思路稀疏数组转原始的二维数组的思路代码实现基本介绍当一个数组中大部分元素是0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:记录数据一共有几行几列,有多少不同的值把具有不同值的元素的行列及值记录在一个小规模数组中,从而缩小程序的规模二维数组 转 稀疏数组的思路遍历 原始的二维数组,得到有效数据的个数 sum根据sum 就可以创建 稀疏数组 sparseAr

2021-03-23 16:50:21 47

原创 Geteway网关

Geteway网关@[Mr_Wzzzz]目录Geteway网关@[Mr_Wzzzz]什么是网关网关在整个微服务中的位置SpringCloud Gateway是什么?SpringCloud Gateway能做什么?核心概念路由 Route断言 Predicate过滤器 Filter网关的工作流程基础使用动态路由的实现自定义过滤器什么是网关网关英文名称为Gateway,又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域网

2021-03-22 13:56:17 859

原创 Hystrix熔断器

Hystrix目录Hystrix服务雪崩Hystrix简介断路器Hystrix作用服务降级(Fall Back)服务器端服务提供方进行服务降级客户端消费方进行服务降级统一全局服务降级方法服务熔断(Break)服务限流(Flow Limit)Hystrix使用服务雪崩  复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败,这就造成有可能会发生服务雪崩。  服务雪崩:多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,

2021-03-20 13:55:08 85

原创 Ribbon负载均衡

Ribbon负载均衡@[Mr_Wzzzz]记录周阳老师的Spring Cloud教程,Ribbon目前已经进入维护模式,未来可以用LoadBalancer来替换目录Ribbon负载均衡@[Mr_Wzzzz]Ribbon简介LB负载均衡(Load Balance)是什么Ribbon本地负载均衡客户端和Nginx服务端负载均衡的区别Ribbon自带的负载均衡算法RoundRobinRule(轮询算法)RandomRule(随机算法)RetryRuleWeightedResponseTimeRuleAvail

2021-03-15 15:51:02 357 2

原创 Eureka

Eureka@[Mr_Wzzzz]提示:Eureka目前已经停止更新,本文主要记录B站周阳老师SpringCloud中所讲目录Eureka@[Mr_Wzzzz]服务治理的概念服务的注册与发现Eureka两大组件Eureka的搭建步骤Eureka集群搭建服务治理的概念在传统的rcp远程调用中,服务与服务之间的依赖关系比较复杂,管理也比较复杂,因此引出了服务治理这个概念,利用服务治理来管理服务之间的依赖关系从而实现服务调用、负载均衡、容错等等,实现服务的注册与发现。eg:曾经我们出门想要使用打车服务,我

2021-03-13 16:15:16 74

原创 红黑树

红黑树@[Mr_Wzzzz]本文主要介绍红黑树的相关特性,对于树的特性不在介绍目录红黑树@[Mr_Wzzzz]什么是红黑树(RBTree)红黑树的性质红黑树的查询红黑树的插入无根节点时有父亲(p)爷爷(pp)节点时无叔叔节点有叔叔节点什么是红黑树(RBTree)包含树的特性,但是其根节点和所有的子节点具有红黑两种颜色,主要是为了提高查询的效率,红黑树不是一个完美的平衡二叉树,但是其实现了左子树和右子树的黑色节点的层数相同,即任意一个节点到每个叶子节点的路径都包含数量相同的黑色节点,这种平衡被称为黑色

2021-03-13 15:12:48 72

原创 Java面试题目记录

Java面试题目记录@[Mr_Wzzzz]前言作为已经找工作上岸的小菜而言,码农之路才刚刚开始,在此总结一下自己在面试中遇到过的高频问题,目前的想法是会持续更新,并加入一些自己学习过程中的知识点。此处只针对问题,具体到某一技术的讲解请移步自行了解提示:以下是本篇文章正文内容,下面案例可供参考目录Java面试题目记录@[Mr_Wzzzz]前言java基础1. JDK 、 JRE和JVM 有什么区别?2. Java 中操作字符串都有哪些类?它们之间有什么区别?3.JAVA虚拟机(jvm)1. 说一下

2021-03-12 15:34:35 715

原创 生成一个包含15个介于1到50之间的随机整数的列表,将其循环左移5个元素。

编写程序,生成一个包含15个介于1到50之间的随机整数的列表,将其循环左移5个元素。这是自己编的,感觉有一点繁琐import randomdef RandomNumber(number,start,end): data = [] n = 0 while True: element =random.randint(start,end) i...

2020-03-20 09:12:13 5105

空空如也

空空如也

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

TA关注的人

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