自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(86)
  • 问答 (1)
  • 收藏
  • 关注

原创 一个测试

因特网以及相关硬件概念因特网是一个互联了全世界的计算机设备的网络,这些计算机设备包括传统的桌面PC,Linux工作站,服务器(用于存储和传输web页面和电子邮件报文等信息) 以及 非传统的因特网端系统(如手机,平板电脑,电视,游戏机等)和安全系统。我们统称这些设备为主机或端系统。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LY62NkKk-1594216073465)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5B

2020-07-08 21:48:49 207 1

原创 Fork/Join框架

什么是Fork/JoinFork/Join框架是一个实现了ExecutorService接口的多线程处理器,它专为那些可以通过递归分解成更细小的任务而设计,最大化的利用多核处理器来提高应用程序的性能Fork/Join框架的工作大致流程为:solve(任务): if(任务已经划分到足够小): 顺序执行任务 else: for(划分任务得...

2020-05-01 15:59:40 154

原创 通信工具类

概述本次我们将讲述JUC包下的一些工具类类 作用 Semaphore 限制线程的数量 Exchanger 两个线程交换数据 CountDownLatch 线程等待直到计数器减为0时开始工作 CyclicBarrier 作用跟CountDownLatch类似,但是可以重复使用 Phaser 增强的CyclicBarrier S...

2020-05-01 15:15:47 169

原创 CopyOnWrite机制

什么是CopyOnWrite容器CopyOnWrite是一种在并发场景下常用的设计思想——写入时复制思想。写入时复制思想是指:当有多个调用者同时去请求一个资源数据的时候,有一个调用者需要对当前数据源进行修改,此时系统将会复制一个当前数据源的副本给调用者修改。也就是说,当我们往一个容器中添加元素的时候,不直接往容器中添加,而是将当前容器进行copy,复制出来一个新的容器,然后向新容器中添加我们需...

2020-05-01 08:05:48 488

原创 并发容器集合ConcurrentLinkedQueue

概述实现一个线程安全的队列有两种方式:(1)使用阻塞算法:用一个锁 (入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现。(2)非阻塞算法:循环使用CAS。ConcurrentLinkedQueue采用的是"wait-free"算法(即CAS算法)来实现。ConcurrentLinkedQueue的结构默认情况下head节点存储元素为空,tail节点等于he...

2020-04-30 19:35:53 150

原创 并发容器集合ConcurrentHashMap

前序在java.util包下提供了一些线程安全的容器类,如Vector和HashTable。但这些容器是通过sychronized实现实现同步,这样读写均需要锁操作,导致性能低下。Java提供了一些代替同步容器的并发容器,使用这些容器可以提高并发访问性。并发MapConcurrentMap接口ConcurrentMap接口继承了Map接口,在Map接口的基础上又定义了4个...

2020-04-30 13:41:52 203

原创 锁接口和类

前序synchronized的不足之处之前我们介绍过Java原生的锁——基于对象的锁。它一般配合synchronized关键字使用。不过synchronized关键字也存在一些不足:(1)如果只是对临界区进行读操作的话,是可以多线程一起执行的。但synchrnoized只允许在同一时间内只有一个线程执行临界区。(2)synchrnoized无法知道线程有没有成功获取锁。(3)当...

2020-04-29 16:47:21 145

原创 阻塞队列

前序当我们实现一个生产者-消费者模式时,我们需要一个存储资源的容器。JDK为我们实现了这样一个容器:阻塞队列BlockingQueue,我们只需要实现存,取操作而不必担心多线程环境下的线程安全问题。接口BlockingQueue是Java util.concurrent(JUC)包下重要的数据结构,区别于普通的队列,BlockingQueue提供了线程安全的队列访问方式,并发包下很多高级同...

2020-04-29 12:16:50 214

原创 Executor框架与线程池

Executor框架在HotSpot VM的线程模型中,Java线程被一对一映射为本地操作系统线程,Java线程启动时会创建一个本地OS线程;当该Java线程终止时,这个OS线程也会被回收。OS会调度所有线程并将它们分配给可用的CPU。在上层,Java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定数量的线程;在底层,OS内核(OSK...

2020-04-29 10:27:53 153

原创 AQS

AQS队列同步器AbstractQueuedSynchronizer(简称AQS)是用来构建锁或其他同步组件的基础框架,从类名中我们可以发现:(1)它是一个抽象类,只实现一些主要逻辑,有些方法由子类实现;除此之外,同步器也提供了一些模板方法:(2)使用先进先出(FIFO)队列存储数据;(3)实现了同步的功能。我们遇到的ReentrantLock,Semaphore,...

2020-04-28 19:13:43 150

原创 CAS与原子操作

CAS什么是CASCAS是一种原子操作,一种系统源语,一条CPU的原子指令。CAS的全称是比较并交换(Compare And Swap),它有三个值:V:要更新的变量(var) E:预期值(expected) N:新值(new)该操作的流程是:判断V是否等于E,若是,则将V的值设置为N;如果不是,说明已经有其它线程更新了V,则当前线程放弃更新,什么都不做。JAVA实现CAS的...

2020-04-28 15:44:33 752

原创 synchronized与锁

synchronized非线程安全非线程安全发生 在多个线程对同一个对象中的实例变量进行并发访问,取到的数据是被修改过的,也就是“脏读”。而线程安全是指获得的实例变量的值是经过同步处理的。在下面的示例代码中,自定义类HasSelfNum对象处理的变量num是方法的本地变量,不存在线程安全。 static class HasSelfNum { public v...

2020-04-27 22:30:30 297

原创 volatile

基本概念内存可见性所有线程创建的实例对象都存放在主内存中(不管该实例对象是成员变量还是方法中的本地变量),而每个线程有自己私有的工作内存,工作内存中保存了一些变量在主内存的拷贝。内存可见性是指线程之间的可见性,即当一个线程修改了共享变量时,另一个线程可以读取到这个修改后的值。重排序为优化程序性能,编译器和处理器对原有的指令执行顺序进行优化重新排序。重排序可能发生在多个阶段,比如...

2020-04-27 17:52:16 102

原创 多线程中的Java内存模型, 重排序与happens-before

概述如果你熟悉JVM,那么你对这张图绝不陌生。对于每一个线程来说,栈都是私有的,而堆是共有的。也就是说,在栈中的变量(局部变量,方法定义参数,异常处理器参数)不会在线程间共享,也就不会有内存可见性的问题;而所有实例域,静态域和数组元素都存储在堆中,这些变量是共享的,我们称为共享变量。访问共享变量现代计算机为了高效,往往会在高速缓存区中缓存共享变量,这是因为CPU访问缓存区要...

2020-04-27 15:38:27 195

原创 leetcode——贪心算法

55. 跳跃游戏题目:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例2:输入: [3,2,1,0,4]输出: fal...

2020-04-27 13:25:07 108

原创 进程与线程

进程与线程进程的产生最初的计算机只能接受一些特定的指令,计算机等待用户输入,用户每输入一个指令,计算机就做出一个操作。大多时候,计算机都处在等待状态。因此效率低下。批处理操作系统用户将多个需要执行的程序写在磁带上,然后交由计算机去读取并逐个执行这些程序,并将输出结果写在另一个磁带上。程序是用某种编程语言编写的,能完成一定任务的代码集合,它是一段静态代码。但是由于批处理操...

2020-04-26 20:32:51 152

转载 JVM调优

概述所有线程共享数据区为:新生代大小+老年代大小+持久代大小。如果在Java堆中增大新生代,则会减小老年代大小。持久代:用于存放静态文件,如Java类的定义信息,方法等。持久代对垃圾回收没有显著影响,但有些应用可能会动态生成或调用一些类,因此需要调整最大堆内存和最小堆内存设置一个比较大的持久代空间来存放运行过程中动态增加的类型。相关参数调整最大堆内存和最小堆内存-Xmx,...

2020-04-24 12:37:50 189

原创 leetcode——哈希表

49. 字母异位词分组题目:给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"]输出:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]说明:所有输入均为小写字母。不考虑答案输出的顺序...

2020-04-23 16:35:10 112

原创 leetcode——树

114. 二叉树展开为链表题目:例如,给定二叉树 1 / \ 2 5/ \ \3 4 6将其展开为:1\ 2 \ 3 \ 4 \ 5 \ 6--------------------------------------------...

2020-04-23 16:34:57 88

原创 leetcode——位运算

338. 比特位计数题目:给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]--------------------------------------------------------------------------------------------...

2020-04-21 21:15:12 107

原创 leetcode——回溯法

22. 括号生成题目:数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。示例:输入:n = 3输出:[ "((()))", "(()())", "(())()", "()(())", "()()()" ]---------------------------...

2020-04-21 21:15:00 114

原创 leetcode——动态规划

198 打家劫舍一个小偷计划偷窃沿街的房屋。每间房内都藏有一定的现金,但相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + ...

2020-04-20 22:19:48 133

原创 leetcode——链表与双指针

283. 移动零题目:给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。要求必须在原数组上操作,不能拷贝额外的数组。示例:输入:[0,1,0,3,12]输出:[1,3,12,0,0]-----------------------------------------------------------------------------...

2020-04-19 22:27:15 102

原创 leetcode——数组

448. 找到所有数组中消失的数字题目:给定一个范围在1 ≤ a[i] ≤ n (n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。要求不适用额外空间(不包括要求返回的数组)且时间复杂度为O(n)。示例:输入:[4,3,2,7,8,2,3,1]输出:[5,6]-----...

2020-04-19 22:26:49 119

转载 数据库——额外补充

大表优化当MySQL一个表中记录数过大时,数据库的CRUD性能会明显下降,常见的优化措施为:限定数据范围禁止不带任何数据范围条件的查询语句,比如在用户查询订单历史时,我们可以控制在一个月的范围内;读/写分离随着用户和数据的增多,单机的数据库支撑不了快速发展的业务,因此便有了数据库集群。而读写分离是数据库集群方式之一。读写分离即一个主库,一个从库或一主多库。业务服务器把写的操...

2020-04-19 17:39:07 208

原创 数据库——redo日志和undo日志

redo日志InnoDB存储引擎是以页为单位来管理存储空间,我们进行的增删改查实质都是在访问页面。在真正访问页面之前,需要把磁盘上的页缓存到内存中的Buffer Pool之后才可以访问。在前面提到事务的四个特性时,持久性指示对于一个已经提交的事务,在事务提交后即使系统发生崩溃,这个事务对数据库所作的修改也不能丢失。如果我们只在Buffer Pool中修改了页面,假设事务提交后突然出现故障,...

2020-04-19 09:35:43 954

原创 数据库——MySQL的索引

索引通过MySQL简介我们了解到InnoDB各个数据页可以组成一个双向链表,而每个数据⻚中的记录会按照主键值从⼩到⼤的顺序组成⼀个单向链 表,每个数据⻚都会为存储在它⾥面的记录⽣成⼀个⻚⽬录,在通过主键查找某条记录的时候可以在⻚⽬录中使⽤⼆分法快速定位到对应的槽,然后再遍历该槽 对应分组中的记录即可快速找到指定的记录。页和记录的关系大致如下图所示,其中页a,页b,页c...页n这些页可以...

2020-04-18 14:49:53 201

原创 数据库——MySQL简介

MYSQL的客户端/服务器架构MySQL的服务器程序直接和我们存储的数据打交道,有很多客户端程序连接到服务器程序,发送增删改查的请求,而服务器响应请求。因此我们使用MySQL的步骤通常为:启动MySQL服务器程序 启动MySQL客户端程序,并连接到服务器程序客户端与服务器的连接MySQL服务器程序和客户端程序本质属于计算机中的进程,MySQL服务器进程的默认名称为mysqld...

2020-04-18 13:37:33 570

原创 数据库——数据库简介和关系数据库理论设计理论

什么是数据库数据库是按照数据结构来组织,存储和管理数据的仓库,我们用关系型数据库(RDBMS)来存储和管理大数据量。关系数据库是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。数据库:一些关联表的集合; 数据表:表是数据的矩阵,一个数据库中的表像是一个表格。 冗余:存储两倍的数据,降低了性能,...

2020-04-17 19:47:59 333

原创 计算机网络——物理层

基本概念用于连接各种网络设备的传输媒体种类很多,大致分为:导引型传输媒体:双绞线;同轴电缆;光纤 非导引型传输媒体:无线电波,微波,红外线,可见光。2.4GHz和5.8GHz频段的WiFi。物理连接也分为点对点连接,广播连接等。计算机网络体系结构中的物理层主要是解决在各种传输媒体上传输比特0和1的问题,进而给数据链路层提供"透明"传输比特流的服务,此处的透明是指数据链路层无需关注物...

2020-04-16 09:38:24 290

原创 剑指offer部分题解

public ListNode EntryNodeOfLoop(ListNode pHead) { ListNode slow = pHead; ListNode fast = pHead; while(fast != null && fast.next != null) { slow = sl...

2020-04-08 17:34:22 201

原创 类加载器

https://blog.csdn.net/SEU_Calvin/article/details/52315125

2020-04-04 21:41:20 92

原创 类加载过程

概述在Java语言里,类型的加载,连接和初始化过程都是在程序运行期间完成的。Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程称为类的加载机制。这种策略为Java提供了极高的扩展性和灵活性,Java天生可以动态动态扩展的语言特性 就是依赖运行期动态加载和动态连接这个特点实现的。例如,在编写一个面...

2020-04-04 10:04:37 84

原创 Class文件结构

概述JVM可以理解的代码叫字节码(扩展名为.class的文件),它只面向虚拟机。Java虚拟机不与包括Java语言在内的任何程序语言绑定,它只与“class”文件 这种二进制文件格式所关联。例如,使用Java编译器把Java代码编译为Class文件,使用JRuby等其他语言可以把他们的源程序编译成Class文件。Class文件结构Class文件是一组以8个字节为基础单位的二进制流...

2020-04-02 15:18:50 93

原创 JDK监控和故障处理工具(深入理解Java虚拟机笔记)

JDK 命令行工具jps列出正在运行的虚拟机进程,并显示虚拟机执行(main()函数所在主类)名称 以及 这些进程的本地虚拟机唯一ID。命令格式为。jps [ options ] [ hostid ]其中选项option代表用户希望查询的虚拟机信息,主要分为三类:类加载,垃圾收集,运行期编译状况,常用的option选项如下如下图所示,210636是本地虚拟机唯一ID...

2020-04-02 10:45:13 101

原创 内存分配,回收策略与垃圾收集器

概述Java内存区域的程序计数器,虚拟机栈,本地方法栈3个区域随着线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而执行着出栈和入栈操作。每一个栈帧中分配多少内存基本在类结构确定下来时就已知了。因此这几个区域的内存分配和回收都具有确定性,当方法结束或线程结束时,内存自然跟着回收。而Java堆和方法区有显著的不确定性:一个接口的多个实现类 需要的内存可能不一样,一个方法执行的不同条件分支...

2020-04-01 19:09:52 141

原创 Java内存区域

Java内存区域与内存区域溢出异常概述对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对 的delete/free代码,不容易出现内存泄漏和内存溢出问题。运行时数据区域JVM在执行Java程序的过程中,会把它管理的内存划分为若干个不同的数据区域。程序计数器程序计数器是当前线程执行字节码(JVM执行的一种指令格式)的行号指示器。在...

2020-04-01 13:25:19 157

原创 Executor框架(Java并发编程的艺术笔记)

Executor框架简介Executor框架的两级调度模型在HotSpot VM的线程模型中,Java线程被一对一映射为本地操作系统线程,Java线程启动时会创建一个本地OS线程;当该Java线程终止时,这个OS线程也会被回收。OS会调度所有线程并将它们分配给可用的CPU。在上层,Java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器(Excutor框架)将这些任务映射为...

2020-03-31 10:46:33 153

原创 线程池(Java并发编程的艺术笔记)

概述线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序 都可以使用线程池。合理地使用线程池能够带来3个好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源, 还会降低系统的稳定性,使用线程池可以进行统一...

2020-03-30 21:47:49 58

原创 Java中的原子操作类 / 并发工具类(Java并发编程的艺术笔记)

等待多线程完成的CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作,简单使用如下。public class Test { public static void main(String[] args) throws InterruptedException{ CountDownLatch clock = new Count...

2020-03-30 21:19:38 123

空空如也

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

TA关注的人

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