自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 并发编程系列(六)AQS同步器独占锁的加锁与解锁-源码分析

通过类图可以看到无论是我们常用的Semaphore还是ReentrantLock都是依赖AbstractQueuedSynchronizer实现的;AbstractOwnableSynchronizer是AbstractQueuedSynchronizer的父类为创建可能需要所有权概念的锁和相关同步器提供了基础。说道AQS我们不得不提到一个人,那就是 Doug Lea。俗话说,不识Doug ...

2020-02-21 22:04:17 219

原创 并发编程系列(五)ThreadLocal的应用与源码解析

ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间对一些公共变量的传递的复杂度。但是如果滥用ThreadLocal,就可能会导致内存泄漏。

2020-02-20 20:20:09 210

原创 并发编程系列(三)JMM内存模型及volatile底层实现原理详解

早期计算机中cpu和内存的速度是差不多的,但在现代计算机中,cpu的指令速度远超内存的存取速度,由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无须等待缓慢的内存读写了...

2020-02-19 10:19:56 346

原创 MYSQL系列(五)事务/事务日志/事务隔离级别

mysql事务事务就是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库 应用该组查询的全部语句,那么执行该组查询。如果其中有任何一条语句应为崩溃或其他原因无法执行, 那么所有的语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。良好的 事务必须满足四大特性。事务的四大特性原子性(Atomicity): 事务是一个原子操作单元,其对数据...

2020-02-14 22:28:06 124

原创 MYSQL系列(三)索引原理和实现

提到mysql的索引,想必很多人都能说上几句:提高查询效率、优化sql的方式。但是索引的底层实现到底是什么?索引是如何存储的?我们将逐一进行说明。本文涉及到内容包括 什么是索引、mysql中操作索引的语法、索引的物理结构、索引的优缺点、索引的数据结构等。什么是索引MySQL官方对索引的定义为:索引(Index)是帮助mysql高效的获取数据的数据结构。可简单理解为排好序的快速查找数据结构。 也...

2020-02-14 16:19:36 201

原创 常见音频格式和图片格式

###常见图片格式。

2024-03-18 22:59:43 256

原创 常见视频名词及视频格式

视频中的常见名词以及常见的视频格式

2024-03-18 22:39:36 381

原创 什么是ChatGpt

工具是商界的热门话题。包括石油巨头、银行、甚至工业巨头卡特彼勒(Caterpillar)在内的一系列公司的管理层在财报电话会议上都提到了这个问题。它还引发了人们对潜在滥用AI的担忧。在课堂上,学生们已经使用ChatGPT来生成完整的论文,而黑客们已经开始测试它来编写恶意代码。那么ChatGPT到底是什么呢?以下是关于流行的人工智能聊天机器人你需要知道的所有简单指南。ChatGPT是旧金山初创公司OpenAI开发的一款人工智能聊天机器人。

2023-08-29 22:51:27 178

原创 ChatGPT发布带动国内大模型布局

首先,我们需要明白大模型(LLM)是指的是那些具有大量参数的机器学习模型。这些模型能够处理庞大的数据集,并且具有更高的预测能力和准确性。虽然大模型需要大量的计算资源和更长的训练时间,但是其高级别的学习和预测能力使得大模型在人工智能领域扮演了重要角色。然后,我们来看GPT。GPT是一种基于Transformer模型架构的生成式语言模型。这种模型的特性在于,它通过预训练模型学习大规模的文本数据,然后能够生成自然流畅的文本内容。GPT在自然语言处理任务中,如对话生成、文本摘要等方面,都展现出了卓越的能力。

2023-08-29 22:32:00 98

原创 MySQL order by 排序使用的字段有重复值导致排序随机的情况

生产环境一个列表页的查询sql:select epc.id, epc.contractName, epc.contractType, epc.officerId,ee.employeeName officerName from er_product_contract epc left join er_employee ee on epc.officerId = ee.employeeId LEFT JOIN simu_product p ON epc.productCode

2021-07-15 17:00:33 1258

原创 linux根文件系统 /etc/resolv.conf 文件详解

为什么需要DNS解析域名为IP地址?网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别如“202.96.134.133”之类的IP地址,而不能认识域名。我们无法记住10个以上IP地址的网站,所以我们访问网站时,更多的是在浏览器地址栏中输入域名,就能看到所需要的页面,这是因为有一个叫“DNS服务器”的计算机自动把我们的域名“翻译”成了相应的IP地址,然后调出IP地址所对应的网页。具体什么是DNSDNS( Domain Name System)是“域名

2021-07-14 11:15:39 3914 1

原创 Spring-Batch的使用

在pom.xml 添加:<dependency> <groupId>com.croot</groupId> <artifactId>croot_batch_starter</artifactId></dependency>使用示例@Configurationpublic class TaInterface03Config {private static final Logger log =

2020-07-01 17:37:56 853

原创 并发编程系列(十四)CAS详解与Unsafe类的应用

我们在前面的并发编程系列文章中,提到过CAS但是我们当时没有过多地进行解释,提到CAS我们首先应该理解一下JAVA中的乐观锁,乐观锁就是每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁用到的机制就是CAS,Compare and Swap(比较与交换)。什么是CASCAS,Compare and Swap(比较与交换)。我们都知道,在java语言之前,...

2020-03-07 17:27:33 181

原创 kafka安装出现异常 Configured broker.id 0 doesn't match stored broker.id 1 in meta.properties

启动kafka后进程运行一会后发现进程就消失了,打开kafka安装目录下(/usr/local/kafka/kafka_2.11-1.1.0/logs)logs文件下的server.log文件 发现报上面异常,对比 配置文件 server.properties中 log.dirs配置的目录下的meta.properties中配置的broker.id和配置目录下的server.propertie...

2020-03-02 13:40:46 1629

原创 后端代码解决跨域问题

跨域问题在开发过程中比较常见,我们可以通过前端使用jsonp来解决,也可以通过后端代码解决。通过后端代码解决方式如下所示:public static void setAllowOrigin(HttpServletRequest request, HttpServletResponse response) { String myOrigin = request.getHeader("...

2020-03-01 14:48:31 429

原创 Redis系列(五)缓存雪崩、缓存穿透、缓存击穿及管道

缓存雪崩我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期,所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。缓存正常从Redis中获取,示意图如下:缓存失效瞬间示意图如下:解决方案:(1)碰到这种情况,一般并发量不是特别多的时候,使用最多的解决方案是加锁排队,伪代码如下:...

2020-03-01 14:36:44 258

原创 Redis系列(四)Redis集群

在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影...

2020-03-01 10:57:54 130

原创 Redis系列(三)Redis主从复制

持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失, 如果通过redis的主从复制机制就可以避免这种单点故障。主从复制架构如下图说明:主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继...

2020-03-01 10:24:03 183

原创 Redis系列(二)Redis的持久化

由于redis是基于内存的数据库,所以如果发生意外将会导致数据丢失,为尽量减少数据丢失,redis提供持久化功能。Redis 支持以下两种持久化方式1.快照形式RDB形式。(默认开启)2.Aof形式。命令形式存储。(需要手动开启)RDB 持久化方式RDB文件是一个经过压缩的二进制文件。以下为配置方式save 开头的一行就是持久化配置,可以配置多个条件(每行配置一个条件),每个条件之...

2020-02-29 21:55:51 122

原创 Redis系列(一)什么是Redis及Redis常用数据结构

Redis的起源2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便 对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。 不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG...

2020-02-29 21:20:24 432

原创 并发编程系列(十三)CyclicBarrier 栅栏-源码解析

从字面意思理解可以看出循环执行,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。循环是因为当等待线程都被释放后,CyclicBarrier对象可以被重用栅栏是强制要求线程到达某个临界点才能执行,当都到达时,一起跳过Cyclicbarrier对象执行。Cyclicbarrier类的属性 /** 对象入口的重如锁 */ private final ReentrantLoc...

2020-02-24 19:37:21 155

原创 并发编程系列(十二)CountDownLatch 闭锁-源码解析

CountDownLatch也叫做闭锁,是一种倒计时计数器。CountDownLatch等待多个线程都执行完成后,再继续做后面的事情。最常见的一个应用场景就是开启多个线程同时执行某个任务,等到所有任务都执行完在统计结果。CountDownLatch内部提供了一个计数器,在构造CountDownLatch时必须执行计数器的初始值,且计数器的初始值必须大于0。另外提供countDown()方法来操作计...

2020-02-24 16:02:13 139

原创 并发编程系列(十一)Semaphore信号量-源码解析

Semaphore底层是基于AbstractQeuedSynchronizer来实现的所以Semaphore的数据结构也是依托于AQS的数据结构1.1 Sync源码解析 /** * 内部类Sync继承自AQS */ abstract static class Sync extends AbstractQueuedSynchronizer { ...

2020-02-23 20:28:24 121

原创 并发编程系列(十)ReentrantLock 重入锁-源码解析

首先我们看一下ReentranLock的类图。我们从类图可以发现ReentranLock的子类Sync是继承AQS类的,前面我们对AQS的源码已经有了一些了解,那么我们一起来看一下ReentranLock的源码和AQS的关系具体是什么呢。我们可以看到ReentranLock实现Lock接口并且有Sync、NonfairSync和FairSync三个内部类的,并且NonfairSync和Fai...

2020-02-23 16:35:22 156

原创 并发编程系列(九)Synchronized的使用与实现原理(续)-锁升级与锁优化

通过 并发编程系列(四)Synchronized的使用与实现原理 我们已经介绍了Synchronized的加锁实现是通过monitor来实现的。但是我们知道monitor的实现是需要依赖操作系统完成。这极大地消耗了性能。因此在使用synchronized同步锁的时候需要进行用户态到内核态的切换。内核态CPU可以访问内存所有数据,包括外围设备,例如硬盘,网卡。CPU也可以将自己从一个程序切换到...

2020-02-22 21:56:19 160

原创 并发编程系列(八)AQS同步器条件锁(Condition)加锁与解锁-源码分析

1.Condition接口在Lock接口中有一个newCondition方法;该方法将创建一个绑定在当前Lock对象上的Condition对象,说明Condition对象和Lock对象是对应的,一个Lock对象可以创建多个Condition对象,他们是一对多的关系。Condition接口的出现是为了扩展同步代码块中的wait/notify机制。通常情况下,我们调用wait()方法,主要是因为一...

2020-02-22 21:06:07 517

原创 并发编程系列(七)AQS同步器共享锁的加锁与解锁-源码分析

独占模式和共享模式的最大的不同就是在同一时刻能否有多个线程获取同步状态。独占模式:获取资源后,只有一个线程获取同步状态并执行共享模式:在获取资源后,多个线程共同执行我常用的Semaphore和CountDownLacth等都是共享锁。1.acquireShare() 方法源码解析此方法是共享模式下线程获取资源的顶层入口,获取成功则直接返回,失败则进入等待队列,并且自旋直到获取资源为止。...

2020-02-22 10:55:41 151

原创 并发编程系列(四)Synchronized的使用与实现原理

synchronized关键字使我们在多线程并发条件下经常使用的一个关键字,下面我们来详细介绍synchronized的应用场景及底层的实现原理。synchronized的使用分类被锁的对象伪代码实例方法类的实例对象public synchronized void method (){......}静态方法类对象public static synchroni...

2020-02-20 09:22:58 186

原创 并发编程系列(二)线程的中断

线程中断的概念java中线程中断是一种协作机制通过中断并不能直接终止线程的运作需要被中断的线程自己处理中断.每个线程都有一个boolean类型的标志位,代表线程是否中断;线程1想中断线程2,线程1只需要设置线程2的中断标识位等于true即可;线程2在合适的时候处理中断请求,甚至线程2可以选择不处理中断请求;结论:设置线程中断后,被中断的线程不是立即停止运行状态。线程中断的相关方法...

2020-02-18 17:23:19 227

原创 并发编程系列(一)线程的创建

多线程Java给多线程编程提供了内置的支持。一个多线程程序包含两个或多个能并发运行的部分。程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行内容。多线程是多任务的一种特别的形式。多线程比多任务需要更小的开销。进程: 一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。...

2020-02-18 17:09:59 206

原创 MYSQL系列(四)Explain/Trace的使用

对于mysql的优化或者查看一下sql的执行,我们常用的就是explain,The EXPLAIN statement provides information about how MySQL executes statements. EXPLAIN works with SELECT, DELETE, INSERT, REPLACE, and UPDATE statements。使用EXPL...

2020-02-14 17:15:27 390

原创 MySQL系列(二)SQL性能下降的原因/SQL执行顺序

我们在开发过程中,时常会有由于数据量不断地增加,接口相应时间过长的问题的出现,这里面有一部分原因就是因为我们的SQL的性能问题,下面我们来一起讨论下是什么造成了SQL的性能下降的。SQL性能下降的原因1.查询语句写的烂这个原因是由于开发人员,在开发过程中,根本没有考虑SQL性能,纯粹是为了完成任务而工作,或者说是一种不负责任的开发行为。例如 无论表中字段是否需要,总是习惯 select *...

2020-02-13 21:58:21 258

原创 MySQL系列(一)mysql架构设计及存储引擎

mysql架构设计1.连接层最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。2.服务层第二层架构主要完成大多数...

2020-02-13 21:18:43 244

转载 JVM系列(六)JVM优化常用工具

在jdk的bin目录下有跟多的 *.exe命令行工具,这些工具非常强大可以监控虚拟机和故障处理。名称作用描述jpsJVM进程状态工具(JVM Process Status Tool)用于显示目标系统上JVM的java进程jstatJVM统计监测工具(JVM Statistics Monitoring Tool)主要用于监测显示JVM的性能统计信息jinfo...

2020-02-12 21:20:06 207

转载 JVM系列(五)JVM常用参数配置大全

1. GC常用参数1.1 堆栈设置-Xss:每个线程的栈大小-Xms:初始堆大小,默认物理内存的1/64-Xmx:最大堆大小,默认物理内存的1/4-Xmn:新生代大小-XX:NewSize:设置新生代初始大小-XX:NewRatio:默认2表示新生代占年老代的1/2,占整个堆内存的1/3。-XX:SurvivorRatio:默认8表示一个survivor区占用1/8的Eden内存,...

2020-02-12 21:02:21 117

原创 JVM系列(四)垃圾收集算法和垃圾收集器

通过上篇文章,我们了解到了在进行GC垃圾回收时,如何判断对象是否是垃圾对象是否可以被回收,那么被标记为垃圾的对象是如何被回收的,被回收后jvm运行时数据区的内存分配又会变成什么样子,本篇文章将逐一进行解答。常用垃圾收集算法1. 标记-清除算法(Mark-Sweep)这是最基础的垃圾回收算法,之所以说它是最基础的是因为它最容易实现,思想也是最简单的。标记-清除算法分为两个阶段:标记阶段和清...

2020-02-12 15:19:58 233

原创 JVM系列(三)如何判断对象可以被回收

我们知道JVM的垃圾回收主要集中在堆内存上,当新生代和老年代空间不足时都会发生GC,那么具体有什么区别和具体可以回收哪些对象呢?下面我们一起来探讨一下。Minor GC/Young GC: 又称新生代GC,指发生在新生代的垃圾收集动作;因为Java对象大多是朝生夕灭,所以Minor GC非常频繁,一般回收速度也比较快;Major GC/Full GC: 指发生在老年代的GC;出现Full ...

2020-02-11 17:23:57 822

原创 JVM系列(二)运行时数据区

jvm运行时数据区非常重要也是非常基础的部分,但是这部分又是对于jvm参数优化的前提,所以更需要我们要着重掌握。本篇文章从周志明《深入理解java虚拟机》摘录了一些内容。运行时数据区JVM执行java程序的时候会把其所管理的内存划分为若干不同的数据区域(根据虚拟机厂商不同会有差异,这里主要是对hotSpot进行讲解),虚拟机规范并不是一成不变的,Oracle在发布新的JAVA版本时,可能会...

2020-02-10 20:52:25 133

原创 JVM系列(一)类加载机制

类加载过程2020年真是一个灾祸重生的一年,开年的春节假期因为肺炎疫情一直延续,弄得人们都人心惶惶,只能憋在家里写写博客打发时间,还是希望疫情早点结束,武汉加油!中国加油!下面言归正传,本系列jvm文章主要从类加载过程、jvm内存模型、jvm垃圾收集、jvm优化等讲解本人对于jvm一些了解,希望能帮助到大家,若有不对之处欢迎,留言一起讨论。上面是JVM虚拟机的一个概览图,本篇博客主要讲解类...

2020-02-09 23:39:51 148

空空如也

空空如也

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

TA关注的人

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