<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[c_c_y_CC的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/c_c_y_CC</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; c_c_y_CC]]></copyright><item><title><![CDATA[如何理解Obj-C中的闭包]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/108555670</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/108555670</guid><author>c_c_y_CC</author><pubDate>Sat, 12 Sep 2020 21:46:15 +0800</pubDate><description><![CDATA[闭包（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 +]]></description><category></category></item><item><title><![CDATA[java多线程之线程创建]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/105411165</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/105411165</guid><author>c_c_y_CC</author><pubDate>Thu, 09 Apr 2020 15:07:48 +0800</pubDate><description><![CDATA[title: java多线程之线程创建
categories: java多线程基础

一、通过继承Thread类

通过直接继承Thread类创建线程是最简单的方法

class Thread1 extends Thread {
    @Override
    public void run() {
        System.out.println(Thread.currentThrea...]]></description><category></category></item><item><title><![CDATA[什么是零拷贝？]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/105380658</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/105380658</guid><author>c_c_y_CC</author><pubDate>Wed, 08 Apr 2020 10:16:21 +0800</pubDate><description><![CDATA[title: java之零拷贝
categories: java基础

一、什么是零拷贝

零拷贝并不是完全的没有拷贝，而是CPU不进行拷贝操作，即CPU进行了零次拷贝

二、传统IO的拷贝次数

当我们从磁盘读取一个文件后通过socket发送出去，经过了几次拷贝呢

// 简答的示意代码，无法运行
FileInputStream fileInputStream = new FileInputS...]]></description><category></category></item><item><title><![CDATA[索引那些事]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/105152814</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/105152814</guid><author>c_c_y_CC</author><pubDate>Fri, 27 Mar 2020 23:07:47 +0800</pubDate><description><![CDATA[title: 索引那些事
categories: MySQL

一、B+Tree索引、B-Tree索引、哈希索引
1. B-Tree索引

B-Tree索引，利用树形结构，同时又不同于二叉树，二叉树每个结点只能有两个结点，数据量大时会造成树的层级过高，导致搜索速度变慢，而B树采用的是多子节点树（非多叉树），使的树的层级减少。但对于范围查询仍有一些缺陷，每个节点都保存数据，因而但范围查询时需返回遍...]]></description><category></category></item><item><title><![CDATA[TCP 与 UDP 的区别]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/105082886</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/105082886</guid><author>c_c_y_CC</author><pubDate>Tue, 24 Mar 2020 22:11:16 +0800</pubDate><description><![CDATA[TCP 与 UDP 的区别
一、TCP面向连接,UDP面向无连接

TCP 是位于传输层的可靠传输协议为用户提供面向连接的可靠传输，如何建立连接？，UDP则是为用户提供尽最大可能交付的无连接服务

二、传播特性

由于TCP面向连接，一条TCP连接只能有两个端点，即为***点对点***的数据传播，而且***TCP支持全双工通信***。而UDP***面向无连接，可提供点对点，点对多***，

三、传...]]></description><category></category></item><item><title><![CDATA[三次握手、四次挥手详解]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/105082818</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/105082818</guid><author>c_c_y_CC</author><pubDate>Tue, 24 Mar 2020 22:09:02 +0800</pubDate><description><![CDATA[一、三次握手

三次握手是所建立连接可靠性的重要保障

1. 流程图解

2. 三次握手原理及为什么需要三次握手

三次握手可保证发送方确保自己及接收方的发送读写功能正常，接收方确保自己及发送方的读写功能正常，同时可以防止重复建立连接


第一次client发送SYN数据包给server，server收到数据包之后确认自己接收正常，client发送正常
server返回一个SYN/ACK数据包给c...]]></description><category></category></item><item><title><![CDATA[Netty之Reactor线程模型]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/104976975</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/104976975</guid><author>c_c_y_CC</author><pubDate>Thu, 19 Mar 2020 21:21:53 +0800</pubDate><description><![CDATA[Reactor 线程模型
一、传统线程模型与NIO模型
1. BIO 模型

传统 I/O 模型为同步阻塞式 I/O 模型，对于网络I/O而言，需要赋予每个连接一个线程，同时该线程会阻塞于I/O事件，无法操作执行其他任务


1.1 处理模型

每当有新连接到来时，创建一个新的线程以对新连接进行处理，可用***线程池***进行优化，但仍然无法应对高并发服务

1.2 服务端代码
public cl...]]></description><category></category></item><item><title><![CDATA[new String、String、String.intern()]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/104976160</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/104976160</guid><author>c_c_y_CC</author><pubDate>Thu, 19 Mar 2020 20:58:54 +0800</pubDate><description><![CDATA[String s1 = new String("")

String s1 = new String(“abc”) 是直接在java队中创建对象然后返回引用，就像我们创建普通对象一样

public static void testNewString() {
    String s1 = new String("abc");	// java堆中创建的对象1
    String s2 = new...]]></description><category></category></item><item><title><![CDATA[netty服务端初始化源码解析]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/104754358</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/104754358</guid><author>c_c_y_CC</author><pubDate>Mon, 09 Mar 2020 15:57:33 +0800</pubDate><description><![CDATA[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...]]></description><category></category></item><item><title><![CDATA[冗余数据与多表查询的选择]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/104675707</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/104675707</guid><author>c_c_y_CC</author><pubDate>Thu, 05 Mar 2020 15:16:29 +0800</pubDate><description><![CDATA[数据冗余与多表查询的选择

最近在家闲得无聊，和一个前端小伙伴联手在开发一个博客网站，遇到了一个mysql上的性能优化问题，在数据处理上，联表查询以及数据冗余操作，应该如何取舍，这个就涉及到了数据库的范式以及反范式

问题描述

获取博客文章评论的时候，需要同时获取评论者的昵称以及头像图片链接，那么这个时候是启用多表查询呢，还是采用数据冗余呢，可能会有人想都不想直接联表查询吧，也可能会有人说数据冗...]]></description><category></category></item><item><title><![CDATA[事务特性及隔离级别]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/104620511</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/104620511</guid><author>c_c_y_CC</author><pubDate>Mon, 02 Mar 2020 21:29:27 +0800</pubDate><description><![CDATA[一、事务特性
1. 原子性

事务的原子性即需保证事务是一个原子操作，要么全部成功一起提交，要么全部失败一起回滚，一个事务不可能之完成其中的一部分

2. 一致性

事务的一致性，即数据库总是从一个一致性状态转换到另一个一致性状态，即不论发生异常或者是机器故障等，事务若没有最终提交，事务中所已经执行语句也不会对数据库产生影响

3. 隔离性

一个事务提交成功之前所作的操作，对其他事务是不可见的
...]]></description><category></category></item><item><title><![CDATA[缓存穿透、缓存雪崩以及缓存击穿]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/104124446</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/104124446</guid><author>c_c_y_CC</author><pubDate>Fri, 31 Jan 2020 15:09:40 +0800</pubDate><description><![CDATA[1. 缓存穿透
1.2 问题简述

缓存击穿就是用户请求数据在数据库对应查询结果为空时，对该结果不进行缓存，从而导致每次查询为空都会直接访问数据库

1.2 解决方法

将在数据库查询为 null 的 key 也缓存起来，设置一定的过期时间，这样只会在 key 失效的额时候访问数据库，可以减轻数据库压力

2. 缓存雪崩
2.2 问题简述

在同一时间内，大量 key 失效，导致对这些 key 的...]]></description><category></category></item><item><title><![CDATA[ReetranLock 源码解析]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/103499058</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/103499058</guid><author>c_c_y_CC</author><pubDate>Wed, 11 Dec 2019 20:27:40 +0800</pubDate><description><![CDATA[ReetranLock 类
1. 方法含义




方法
说明




lock()
阻塞的获得锁


tryLock()
非阻塞式获取锁


unlock()
释放锁


newCondition()



tryLock(long timeout, TimeUnit unit)



2. 方法解析
public void lock() {
    // 直接调用同步器的lock()
    ...]]></description><category></category></item><item><title><![CDATA[二叉查找树的java实现]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/103498959</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/103498959</guid><author>c_c_y_CC</author><pubDate>Wed, 11 Dec 2019 20:20:55 +0800</pubDate><description><![CDATA[二叉查找树
1. 定义


若左子树不空，则左子树上所有结点的值均小于它的根结点的值
若右子树不空，则右子树上所有结点的值均大于它的根结点的值
左、右子树也分别为二叉查找树
没有键值相等的结点

2. 增删查
2.1 插入

 public void insert(T val) {
    if (val == null)
        throw new NullPointerExceptio...]]></description><category></category></item><item><title><![CDATA[常用SQL语句详解]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/102976983</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/102976983</guid><author>c_c_y_CC</author><pubDate>Fri, 08 Nov 2019 17:20:55 +0800</pubDate><description><![CDATA[一、DDL

DATA DEFINITION LANGUAGES （数据定义语言），这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象。常用的语句关键字主要包括 CREATE、DROP、ALTER 等。

1. 数据库定义
1.1 查看数据库
mysql&gt; SHOW DATABASES;
+--------------------+
| Database           |
+...]]></description><category></category></item><item><title><![CDATA[消息中间件介绍以及常见消息中间件对比]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/102509615</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/102509615</guid><author>c_c_y_CC</author><pubDate>Fri, 11 Oct 2019 20:28:22 +0800</pubDate><description><![CDATA[一、为什么要使用消息队列
1. 解耦及异步

使用消息队列可以将同步调用变为异步调用，同时降低系统模块之间的耦合度


2. 削峰

当系统压力过大时，将操作缓存在消息队列中，后面不断读取消息进行操作，达到削峰的目的


3. 复用(可拓展性)

如果系统A要发送消息给多个系统，此时每增加一个子系统，系统A的代码就需要修改，使用消息队列之后，系统A将消息发送到消息队列，其他系统读取消息即可。新增系...]]></description><category></category></item><item><title><![CDATA[jvm学习笔记（一）-- java内存区域]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/93229033</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/93229033</guid><author>c_c_y_CC</author><pubDate>Fri, 21 Jun 2019 20:32:14 +0800</pubDate><description><![CDATA[运行时数据区域

一、程序计数器(记录程序运行的位置)

程序计数器是一块较小的内存空间，可以看作当前线程所执行的字节码的行号指示器
字节码解释器工作室就是通过改变计数器的值来选择下一条需要执行的字节码指令，分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器来完成
java多线程是通过时间切片来分配线程执行的，当一个线程的时间片耗尽时，就需要有一个记录线程的运行记录，方便下一次轮转到此...]]></description><category></category></item><item><title><![CDATA[AVLTree的构建，java实现]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/88996403</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/88996403</guid><author>c_c_y_CC</author><pubDate>Wed, 03 Apr 2019 15:20:38 +0800</pubDate><description><![CDATA[AVLTree

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


package com.ccy.tree;

import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
...]]></description><category></category></item><item><title><![CDATA[归并排序的java实现]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/88960620</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/88960620</guid><author>c_c_y_CC</author><pubDate>Tue, 02 Apr 2019 00:36:54 +0800</pubDate><description><![CDATA[归并排序是分治思想的一种体现，将一个数组不断划分缩小，最后在合并统一

	public static &lt;E extends Comparable&lt;? super E&gt;&gt; void mergeSort(E[] array) {
		
		E[] temp = (E[])new Comparable[array.length];
		mergeSort(array,temp,...]]></description><category></category></item><item><title><![CDATA[一个简易自定义ArrayList的实现]]></title><link>https://blog.youkuaiyun.com/c_c_y_CC/article/details/88936788</link><guid>https://blog.youkuaiyun.com/c_c_y_CC/article/details/88936788</guid><author>c_c_y_CC</author><pubDate>Sun, 31 Mar 2019 22:09:06 +0800</pubDate><description><![CDATA[一个自定义可变长度数组的java实现
package com.ccy.List;

import java.util.Iterator;
/**
 * ArrayList的自定义实现
 * 
 * @author ccy
 *	
 * @param &lt;E&gt; 
 */
public class MyArrayList&lt;E&gt; implements MyList&lt;E&gt;...]]></description><category></category></item></channel></rss>