自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何理解Obj-C中的闭包

闭包(BLocks)能够读取使用其他变量的函数1. 简单示例int (^getSum)(int nums1, int nums2) = ^(int nums1, int nums2) { return nums1 + nums2;}; NSLog(@"%d + %d = %d", 5, 10, getSum(5, 10));// 输出// 2020-09-12 20:12:44.017162+0800 learn_obj_c[758:11162] 5 +

2020-09-12 21:46:15 204

原创 java多线程之线程创建

title: java多线程之线程创建categories: java多线程基础一、通过继承Thread类通过直接继承Thread类创建线程是最简单的方法class Thread1 extends Thread { @Override public void run() { System.out.println(Thread.currentThrea...

2020-04-09 15:07:48 197

原创 什么是零拷贝?

title: java之零拷贝categories: java基础一、什么是零拷贝零拷贝并不是完全的没有拷贝,而是CPU不进行拷贝操作,即CPU进行了零次拷贝二、传统IO的拷贝次数当我们从磁盘读取一个文件后通过socket发送出去,经过了几次拷贝呢// 简答的示意代码,无法运行FileInputStream fileInputStream = new FileInputS...

2020-04-08 10:16:21 254

原创 索引那些事

title: 索引那些事categories: MySQL一、B+Tree索引、B-Tree索引、哈希索引1. B-Tree索引B-Tree索引,利用树形结构,同时又不同于二叉树,二叉树每个结点只能有两个结点,数据量大时会造成树的层级过高,导致搜索速度变慢,而B树采用的是多子节点树(非多叉树),使的树的层级减少。但对于范围查询仍有一些缺陷,每个节点都保存数据,因而但范围查询时需返回遍...

2020-03-27 23:07:47 129

原创 TCP 与 UDP 的区别

TCP 与 UDP 的区别一、TCP面向连接,UDP面向无连接TCP 是位于传输层的可靠传输协议为用户提供面向连接的可靠传输,如何建立连接?,UDP则是为用户提供尽最大可能交付的无连接服务二、传播特性由于TCP面向连接,一条TCP连接只能有两个端点,即为***点对点***的数据传播,而且***TCP支持全双工通信***。而UDP***面向无连接,可提供点对点,点对多***,三、传...

2020-03-24 22:11:16 117

原创 三次握手、四次挥手详解

一、三次握手三次握手是所建立连接可靠性的重要保障1. 流程图解2. 三次握手原理及为什么需要三次握手三次握手可保证发送方确保自己及接收方的发送读写功能正常,接收方确保自己及发送方的读写功能正常,同时可以防止重复建立连接第一次client发送SYN数据包给server,server收到数据包之后确认自己接收正常,client发送正常server返回一个SYN/ACK数据包给c...

2020-03-24 22:09:02 213

原创 Netty之Reactor线程模型

Reactor 线程模型一、传统线程模型与NIO模型1. BIO 模型传统 I/O 模型为同步阻塞式 I/O 模型,对于网络I/O而言,需要赋予每个连接一个线程,同时该线程会阻塞于I/O事件,无法操作执行其他任务1.1 处理模型每当有新连接到来时,创建一个新的线程以对新连接进行处理,可用***线程池***进行优化,但仍然无法应对高并发服务1.2 服务端代码public cl...

2020-03-19 21:21:53 165

原创 new String、String、String.intern()

String s1 = new String("")String s1 = new String(“abc”) 是直接在java队中创建对象然后返回引用,就像我们创建普通对象一样public static void testNewString() { String s1 = new String("abc"); // java堆中创建的对象1 String s2 = new...

2020-03-19 20:58:54 170

原创 netty服务端初始化源码解析

Netty 服务端初始化一、服务端启动代码示例package com.ccy.nettyTest;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.*;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket...

2020-03-09 15:57:33 155

原创 冗余数据与多表查询的选择

数据冗余与多表查询的选择最近在家闲得无聊,和一个前端小伙伴联手在开发一个博客网站,遇到了一个mysql上的性能优化问题,在数据处理上,联表查询以及数据冗余操作,应该如何取舍,这个就涉及到了数据库的范式以及反范式问题描述获取博客文章评论的时候,需要同时获取评论者的昵称以及头像图片链接,那么这个时候是启用多表查询呢,还是采用数据冗余呢,可能会有人想都不想直接联表查询吧,也可能会有人说数据冗...

2020-03-05 15:16:29 2547

原创 事务特性及隔离级别

一、事务特性1. 原子性事务的原子性即需保证事务是一个原子操作,要么全部成功一起提交,要么全部失败一起回滚,一个事务不可能之完成其中的一部分2. 一致性事务的一致性,即数据库总是从一个一致性状态转换到另一个一致性状态,即不论发生异常或者是机器故障等,事务若没有最终提交,事务中所已经执行语句也不会对数据库产生影响3. 隔离性一个事务提交成功之前所作的操作,对其他事务是不可见的...

2020-03-02 21:29:27 330

原创 缓存穿透、缓存雪崩以及缓存击穿

1. 缓存穿透1.2 问题简述缓存击穿就是用户请求数据在数据库对应查询结果为空时,对该结果不进行缓存,从而导致每次查询为空都会直接访问数据库1.2 解决方法将在数据库查询为 null 的 key 也缓存起来,设置一定的过期时间,这样只会在 key 失效的额时候访问数据库,可以减轻数据库压力2. 缓存雪崩2.2 问题简述在同一时间内,大量 key 失效,导致对这些 key 的...

2020-01-31 15:09:40 98

原创 ReetranLock 源码解析

ReetranLock 类1. 方法含义方法说明lock()阻塞的获得锁tryLock()非阻塞式获取锁unlock()释放锁newCondition()tryLock(long timeout, TimeUnit unit)2. 方法解析public void lock() { // 直接调用同步器的lock() ...

2019-12-11 20:27:40 211

原创 二叉查找树的java实现

二叉查找树1. 定义若左子树不空,则左子树上所有结点的值均小于它的根结点的值若右子树不空,则右子树上所有结点的值均大于它的根结点的值左、右子树也分别为二叉查找树没有键值相等的结点2. 增删查2.1 插入 public void insert(T val) { if (val == null) throw new NullPointerExceptio...

2019-12-11 20:20:55 162

原创 常用SQL语句详解

一、DDLDATA DEFINITION LANGUAGES (数据定义语言),这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。常用的语句关键字主要包括 CREATE、DROP、ALTER 等。1. 数据库定义1.1 查看数据库mysql> SHOW DATABASES;+--------------------+| Database |+...

2019-11-08 17:20:55 153

原创 消息中间件介绍以及常见消息中间件对比

一、为什么要使用消息队列1. 解耦及异步使用消息队列可以将同步调用变为异步调用,同时降低系统模块之间的耦合度2. 削峰当系统压力过大时,将操作缓存在消息队列中,后面不断读取消息进行操作,达到削峰的目的3. 复用(可拓展性)如果系统A要发送消息给多个系统,此时每增加一个子系统,系统A的代码就需要修改,使用消息队列之后,系统A将消息发送到消息队列,其他系统读取消息即可。新增系...

2019-10-11 20:28:22 472

原创 jvm学习笔记(一)-- java内存区域

运行时数据区域一、程序计数器(记录程序运行的位置)程序计数器是一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器字节码解释器工作室就是通过改变计数器的值来选择下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器来完成java多线程是通过时间切片来分配线程执行的,当一个线程的时间片耗尽时,就需要有一个记录线程的运行记录,方便下一次轮转到此...

2019-06-21 20:32:14 144

原创 AVLTree的构建,java实现

AVLTree是一种自平衡的二叉查找树,平衡表示其每个节点的左右子树的高度差最多为一,可以减少检索是由于极端情况产生的消耗实现的过程中需注意在插入和删除的过程维持平衡维持平衡的情况双旋转单旋转package com.ccy.tree;import java.util.Queue;import java.util.concurrent.ArrayBlockingQueue;...

2019-04-03 15:20:38 379

原创 归并排序的java实现

归并排序是分治思想的一种体现,将一个数组不断划分缩小,最后在合并统一 public static <E extends Comparable<? super E>> void mergeSort(E[] array) { E[] temp = (E[])new Comparable[array.length]; mergeSort(array,temp,...

2019-04-02 00:36:54 137

原创 一个简易自定义ArrayList的实现

一个自定义可变长度数组的java实现package com.ccy.List;import java.util.Iterator;/** * ArrayList的自定义实现 * * @author ccy * * @param <E> */public class MyArrayList<E> implements MyList<E>...

2019-03-31 22:09:06 303

原创 堆排序的实现

package com.cy.util;public class SortUtil { public static <E extends Comparable<? super E>> void heapSort(E[] objects) { int length = objects.length; int pos = length/2-1; //将...

2019-03-31 11:25:54 162

原创 shiro快速入门(一)

权限控制常用方式url拦截将客户端发送到服务器的请求进行拦截,之后进行权限控制方法注解为controller层创建代理对象,由代理对象进行权限校验shiro核心功能认证授权会话管理加密认证流程applicationcode–调用–>subject–调用–>security manager–调用–>realmapplication...

2019-03-23 21:45:48 337

原创 redis操作

redis优势Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。Redis支持数据的备份,即master-slave模式的数据备份。redis配置示例127.0.0.1:6379&amp;gt; CONFIG GET * ...

2019-03-16 20:43:50 120

原创 struts2学习笔记

一、web.xml&lt;!-- 配置过滤器 --&gt;&lt;filter&gt; &lt;filter-name&gt;struts&lt;/filter-name&gt; &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter&lt;/filter...

2019-03-16 20:39:34 103

空空如也

空空如也

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

TA关注的人

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