- 博客(123)
- 收藏
- 关注
原创 第一章:绪论
架构是体现在组件中的一个系统的基本组织、它们彼此的关系与环境的关系以及指导它的设计和发展的原则。系统是组织起来完成某一特定功能火一组功能的组件集。系统这个术语包括了单独的应用程序、传统意义上的系统、子系统、系统之系统、产品线、整个企业及感兴趣的其他集合。系统用于完成其环境中的一个或多个任务。环境或上下文决定了对这个系统的开发、运作、政策以及会对系统造成其他影响的环境和设置。任务是由一个或多个利益相关者通过系统达到一些目标的系统的一个用途或操作。
2023-09-03 23:02:57
591
原创 深入理解ForkJoin
因为对于计算任务较重的任务,CPU的每个核心基本都是满负荷的,设置更多的线程不仅不会提升性能,反而由于线程之间对CPU资源的争抢造成不必要的上下文切换导致性能下降。在需要执行新的任务时,同样在工作队列的尾端取任务。工作线程处理自己的工作队列的同时,还可以窃取其他工作线程的任务,为了降低冲突的发生,窃取的位置在工作队列的首端。一般情况下,工作线程是从它自己对应的工作队列(WorkQueue数组)的头部获取任务执行,但当它的工作队列为空时会从其他繁忙的工作线程的工作队列的尾部窃取任务来执行。
2023-08-21 23:23:47
1045
原创 深入理解阻塞队列BlockingQueue
ArrayBlockingQueue是一个基于静态数组实现的有界阻塞队列,遵循“先进先出”的原则。静态数组表示队列长度是固定的,没有扩容机制。另外在静态数组中没有元素的位置存储的是null,这一点从上面的源码也可以看出来。ArrayBlockingQueue使用了一个ReentrantLock锁,这意味着其存取操作加的都是同一把锁,即其存取操作不能同时进行,存储操作排斥。
2023-08-21 23:23:05
302
原创 深入理解CyclicBarrier
CyclicBarrier翻译过来是回环栅栏,它可以实现让一组线程等待至某个状态之后再全部同步执行,这个状态叫屏障点。当所有等待线程都被释放后,CyclicBarrier可以重置再次使用。CyclicBarrier的功能是由ReentrantLock和Condition共同实现的,因此在其内部拥有ReentrantLock类型的lock属性和Condition类型的trip属性。此外,还有用于保存该屏障拦截的线程数parties属性和当前剩余等待的线程数count属性。
2023-08-21 23:22:30
231
原创 深入理解CountDownLatch
CountDownLatch是一个同步协助类,通常用于一个或多个线程等待,直到其他线程完成某项工作。CountDownLatch使用一个计数值进行初始化,调用它提供的await()方法的线程会被阻塞直到该计数值减为0。减计数值的方法是countDown(),该方法可以在同一个线程中多次调用,也可以在多个线程中被调用,当计数值减为0时所有调用await()方法的线程被唤醒。
2023-08-21 21:36:24
147
原创 深入理解Semaphore
Semaphore(信号量)是操作系统中PV操作的原语在java中的实现,它也是基于AQS实现的。其中PV操作是操作系统中一种实现进程互斥与同步的有效方法。PV操作与信号量(S)的处理有关,P表示通过,V表示释放。用PV操作来管理共享资源时,首先要确保PV操作自身执行的正确性。ReentrantLock是AQS的独占锁实现,Semaphore是AQS的共享锁实现。Semaphore通过设置资源数量可以实现限流的功能,即控制同时只能有n个线程获取信号量。
2023-08-21 21:35:51
284
原创 深入理解AQS和ReentrantLock
在AQS的设计中,使用一个volatile修饰的state变量来表示资源的状态,但对于AQS的不同实现,这个state表示的意义也是不同的。例如对于ReentrantLock来说state是某个线程重入锁的次数,对于Semaphore来说state是共享资源的数量等等。AQS具有MESA模型所定义的同步队列和条件队列。同步等待队列:主要用于维护获取锁失败时入队的线程;
2023-08-21 21:35:20
122
原创 深入理解synchronized
synchronized是Java提供的一种原子性内置锁,Java中的每个对象都可以把它当作一个同步锁来使用,这些Java内置的使用者看不到的锁被称为内置锁,也叫监视器锁。互斥是保证临界区的竟态条件发生,同一时刻只能有一个线程执行临界区代码;同步是由于线程执行的先后顺序不同,某个线程需要等待其他线程运行到某个点。synchronized可以使用在多个地方,使用位置决定了锁对象,具体如下表:位置分类具体分类伪代码被锁的对象方法实例方法调用该方法的类的实例对象静态方法类对象代码块。
2023-08-21 21:32:44
136
原创 深入理解CAS和Atomic工具类
需要注意的是,它只会保证修改对象引用的线程安全。需要注意的是,如果先调用两次unpark()方法再调用两次park()方法,线程仍会阻塞,因此两次unpark()方法与一次unpark()方法效果一致,只是将_counter的值设为1,但park()方法调用一次都需要消耗掉一个凭证。ABA问题指的是当有多个线程对一个原子类进行操作的时候,某个线程在短时间内将原子类的值A修改为B,随后又将其修改为A,这个过程对于其他线程是感知不到的,其他线程在用A值与修改后的A值比较还是相等的,最终可以修改成功。
2023-08-21 21:32:10
251
原创 深入理解Java线程
需要注意的是,优先级并不是绝对的,因为Java线程是通过映射到系统的原生线程来实现的,因此线程调度最终还是取决于操作系统,优先级只是或多或少的可以影响到一些。join()方法可以理解成是线程合并,当在一个线程中调用另一个线程的join方法时,当前线程阻塞等待被调用join()方法的线程执行完毕才能继续执行,所以join()方法的好处是能保证线程的执行顺序,但调用join()方法的线程和当前线程已经失去了并发的意义,虽然存在多个线程,但本质还是串行执行的。线程互斥可以看成是一种特殊的线程同步。
2023-08-21 21:31:35
135
原创 深入理解JMM和并发三大特性
其缺点是窥探是不可扩展的。而基于目录的机制延迟较高,但使用更少的带宽,因为消息是点对点的,而不是广播的,因此许多较大的系统(>64位处理器)使用这种类型的缓存一致性。缓存锁定是指内存区域如果被缓存在处理器的缓存行中,并且在Lock操作期间被锁定,那么当它执行锁操作协会内存时,处理器不会在总线上发出LOCK#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会组织同时修改由两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行的数据时,会使该缓存行无效。
2023-08-21 21:31:03
296
原创 Sping核心组件介绍
在学习Spring源码之前,我们首先来简单介绍Spring框架中较重要的一些概念和组件,了解了这些更有利于我们源码的学习。这些内容做到大概了解即可,后面介绍源码的时候它们的作用和形象就会慢慢立体起来,再回来看本篇文章就都明白了。
2023-08-16 22:48:27
171
原创 Bean的生命周期
Bean的生命周期,就是从创建Bean到销毁Bean的过程。在这个过程中,Spring提供了很多扩展点,这些扩展点具象化的表示就是各种BeanPostProcessor(Bean的后置处理器)的实现。本篇主要的内容就是介绍扫描Bean、实例化Bean、销毁Bean以及中间夹杂着执行各种Bean的后置处理器的过程。
2023-08-16 22:47:16
167
原创 IOC简介
前言 本篇简单介绍了Spring IOC的概念以及使用,部分内容总结摘抄自《spring揭秘》,仅作笔记。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):import numpy as np import pandas as pd import matplotlib.pyplot as plt import ...
2021-11-08 21:36:51
10231
原创 ip协议介绍
前言 本篇文章简单介绍计算机网络层的IPv4和IPv6以及它们的相关概念和区别,内容皆总结摘抄自《计算机网络:自顶向下方法》,仅作笔记。 目前正在使用的IP有两个版本,分别为IP版本4(简称IPv4)和IP版本6(简称IPv6),下面简单介绍这两个版本的IP。一、IPv4 网络层的分组也叫做数据报,因此IPv4的分组也称为IPv4数据报。IPv4的数据报格式如下图:...
2021-09-15 15:25:17
1179
原创 MySQL引擎
前言提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwa...
2021-09-09 21:38:59
321
原创 Elasticsearch搜索数据DSL语法(二)
目录前言3、match_phrase查询4、match_phrase_prefix查询5、multi_match查询6、term查询7、terms查询8、bool查询9、term过滤器10、布尔过滤器11、range查询和过滤器12、wildcard查询总结前言 本篇文章接Elasticsearch搜索数据DSL语法(一)继续介绍查询和过滤器语法,部分内容总结摘抄自《Elasticsearch实战》,仅作笔记。3、matc......
2021-08-04 08:22:44
585
原创 Elasticsearch搜索数据DSL语法(一)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分
2021-08-04 08:17:47
1233
原创 shell脚本
系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言 本篇介绍shell脚本,内容皆总结摘抄自《鸟哥的linux私房菜:基础学习篇》,仅作笔记。提示:以下是本篇文章正文内容,下面案例可供参考一..
2021-07-29 15:04:01
775
原创 elasticsearch介绍
文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言 本篇介绍elasticsearch的提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):import numpy as np import pandas as pd import matplotlib...
2021-07-27 10:02:59
3229
2
原创 elasticsearch和kibana的安装和启动
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结前言 本篇介绍elasticsearch和kibana在Linux系统中的安装和启动操作。一、es的下载、配置和启动1、安装JDK 由于es是使用Java语言开发的引擎,因此要安装es首先要安装JDK,在Oracle官网下载Linux的JDK1.8版本,使用FTP工具上传到服务器上,然.....
2021-07-22 14:05:26
3836
1
原创 Linux文件与目录管理(上)
本篇主要介绍Linux文件和目录的常用操作和命令,内容皆总结摘抄自《鸟哥的Linux私房菜:基础学习篇》,仅作笔记。特殊目录在这篇文章中提到了“.”和“..”这两个特殊的目录,事实上Linux系统中除了这两个还有不少的特殊目录。下面是特殊目录的简介:.(英文句号):代表此层目录; ..(两个英文句号):代表上一层目录; -:代表前一个工作目录; ~:代表目前用户的工作目录; ~账号名称(例如~root):代表”账号名称“这个用户的家目录。需要特别注意的是,在所有目录下面都会存在“.”和
2021-05-17 12:16:04
377
原创 Linux简单介绍
本篇简单介绍Linux的基本相关概念,毕竟学习一个东西还是要知道它的前世今生的,内容皆总结摘抄自《鸟哥的Linux私房菜:基础学习篇》的第一部分,仅作笔记。Linux本质上是一个操作系统最底层的及其提供的内核工具。由于它是GNU GPL授权模式,因此所有人都可以取得它的源码与执行内核程序,并且可以修改。Linux参考了POSIX规范,于是兼容了UNIX操作系统,因此也成为UNIX-like(类UNIX)的一种。GNU(GNU's Not UNIX),是一个叫Stallman的男人发起的计划名称,该计
2021-04-22 22:45:36
452
原创 Java网络编程之可靠数据传输原理
本篇介绍计算机网络中的可靠数据传输原理,内容皆总结摘抄自《计算机网络:自顶向下方法》,仅作笔记。学习可靠数据传输框架如下图:运输层为应用层提供的服务可以抽象为:数据可以通过一条可靠的信道进行传输。借助于可靠信道,传输数据比特就不会受到损坏(例如由0变为1,或由1变为0)或者丢失,而且所有的数据都是按照其发送顺序进行交付。这也是TCP向调用它的因特网应该所提供的服务模型。可靠数据传输协议(reliable data transfer protocol)就是用来实现这种服务抽象的。...
2020-12-14 01:28:28
787
原创 Spring Boot之@SpringBootApplication注解以及其他常用注解
篇介绍Spring Boot基础,部分内容总结摘抄自《Spring Boot实战派》,仅作笔记。@SpringBootApplication注解@SpringBootApplication是Spring Boot的核心注解,其主要目的是开启自动配置。想要具体了解我们可以在启动类中打开此注解定义,打开后可以发现其被如下元注解修饰:@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inheri.
2020-10-08 21:22:48
803
1
原创 Spring Boot之Bean的懒加载
一般情况下,Spring容器在启动的时候就会创建全部的Bean对象。懒加载可以使Bean对象在第一次使用时再加载,懒加载的实现可以使用@Lazy注解。下面通过一个例子来了解@Lazy注解的使用以及效果。现在有Student类:public class Student implements Serializable { private static final long serialVersionUID = -8501834904335726021L; private String sNumbe
2020-10-07 00:57:52
885
原创 Java集合之HashMap
本篇介绍集合中的HashMap的数据结构以及主要方法的源码。HashMap基于散列表,继承了AbstractMap,实现了Map接口,存储的也是无序的键值对,可以存储null键和null值。其内部也是通过维护一个链表数组来实现各个功能,在JDK1.8中链表长度大于8时会转变为红黑树。一个一般的HashMap的数据结构可能类似下图:下面是HashMap的几个主要成员变量,此处简单了解,后面用到会详细介绍。//HashMap即由此可以存储键值对的链表的数组实现transient Node
2020-09-28 00:27:04
285
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人