<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[河湾]]></title><description><![CDATA[积土而为山，积水而为海]]></description><link>https://blog.youkuaiyun.com/shenso</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; shenso]]></copyright><item><title><![CDATA[RPC学习笔记]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/101355027</link><guid>https://blog.youkuaiyun.com/shenso/article/details/101355027</guid><author>shenso</author><pubDate>Wed, 25 Sep 2019 12:07:54 +0800</pubDate><description><![CDATA[什么是RPC？
Remote Procedure Call Protocol，远程过程调用。
什么是“远程”？
先来看下什么是“近”，即“本地函数调用”。

int result = Add(1, 2);

这行代码的时候，到底发生了什么？


传递两个入参
调用了本地代码段中的函数，执行运算逻辑
返回一个出参

这三个动作，都发生在同一个进程空间里，这是本地函数调用。
那有没有办法，调用一个跨进...]]></description><category></category></item><item><title><![CDATA[Java多线程并发：进程调度算法]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/90419149</link><guid>https://blog.youkuaiyun.com/shenso/article/details/90419149</guid><author>shenso</author><pubDate>Wed, 22 May 2019 00:13:38 +0800</pubDate><description><![CDATA[一 优先调度算法
1.先来先服务调度算法（FCFS）
当在作业调度中采用该算法时，每次调度都是从后备作业队列中选择一个或多个最先进入该队
列的作业，将它们调入内存，为它们分配资源、创建进程，然后放入就绪队列。在进程调度中采用 FCFS 算法时，则每次调度是从就绪队列中选择一个最先进入该队列的进程，为之分配处理机，使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机，特点是：算法比较...]]></description><category></category></item><item><title><![CDATA[互联网架构：从设计到开发让你少踩坑]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/90287508</link><guid>https://blog.youkuaiyun.com/shenso/article/details/90287508</guid><author>shenso</author><pubDate>Fri, 17 May 2019 09:57:04 +0800</pubDate><description><![CDATA[本文作者：朱晔，熟悉.NET、Java技术栈，多年MVP，先后任职育碧软件、英孚教育、5173、空中网、饿了么等互联网公司，对技术管理、系统架构、深度学习比较感兴趣。

本文出自：技术琐话



这里所说的三架马车是指微服务、消息队列和定时任务。如下图所示，这里是一个三驾马车共同驱动的一个立体的互联网项目的架构。不管项目是大是小，这个架构模板的形态一旦定型了之后就不太会变，区别只是我们...]]></description><category></category></item><item><title><![CDATA[Java多线程并发：CyclicBarrier、CountDownLatch、Semaphore 的用法]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/90287453</link><guid>https://blog.youkuaiyun.com/shenso/article/details/90287453</guid><author>shenso</author><pubDate>Fri, 17 May 2019 09:53:03 +0800</pubDate><description><![CDATA[关注微信公众号：「树森笔记」
1、CountDownLatch（线程计数器 ）
CountDownLatch类位于java.util.concurrent包下，利用它可以实现类似计数器的功能。比如有一个任务A，它要等待其他4个任务执行完毕之后才能执行，此时就可以利用CountDownLatch来实现这种功能了。
  final CountDownLatch latch = new CountDow...]]></description><category></category></item><item><title><![CDATA[僵尸进程与孤儿进程]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/88935081</link><guid>https://blog.youkuaiyun.com/shenso/article/details/88935081</guid><author>shenso</author><pubDate>Sun, 31 Mar 2019 20:45:03 +0800</pubDate><description><![CDATA[僵尸进程与孤儿进程
1 基本概念
unix/linux中，正常情况下，子进程是通过父进程创建的，子进程再创建新的进程。子进程的结束和父进程的运行是一个异步过程，即父进程永远无法预测子进程到底什么时候结束。当一个 进程完成它的工作终止之后，它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。


孤儿进程：一个父进程退出，而它的一个或多个子进程还在运行，那么那些子进程将...]]></description><category></category></item><item><title><![CDATA[基本类型int和包装类型integer的比较 - == or equals]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/80327976</link><guid>https://blog.youkuaiyun.com/shenso/article/details/80327976</guid><author>shenso</author><pubDate>Tue, 15 May 2018 19:24:17 +0800</pubDate><description><![CDATA[java中有两种类型


基本类型：基本数据类型存的是数值本身
引用类型：引用类型变量在内存放的是数据的引用


基本类型通过==比较的是它们的值大小，而引用类型比较的是他们的引用地址。 
基本类型和包装类型通过==比较的是值的大小，通过equals比较的也是值得大小。



public boolean equals(Object obj) {
    if (obj instanceof In...]]></description><category></category></item><item><title><![CDATA[排序算法之归并排序]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/80302186</link><guid>https://blog.youkuaiyun.com/shenso/article/details/80302186</guid><author>shenso</author><pubDate>Sun, 13 May 2018 20:03:44 +0800</pubDate><description><![CDATA[归并排序是建立在归并操作上的一种有效的排序算法，1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法（Divide and Conquer）的一个非常典型的应用，且各层分治递归可以同时进行。

基本思想

归并排序（MERGE-SORT）是利用归并的思想实现的排序方法，该算法采用经典的分治（divide-and-conquer）策略（分治法将问题分(divide)成一些小的问题然后递归求解，而...]]></description><category></category></item><item><title><![CDATA[排序算法之快速排序]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/80301799</link><guid>https://blog.youkuaiyun.com/shenso/article/details/80301799</guid><author>shenso</author><pubDate>Sun, 13 May 2018 19:15:02 +0800</pubDate><description><![CDATA[快速排序（Quicksort）是对冒泡排序的一种改进，借用了分治的思想，由C. A. R. Hoare在1962年提出。

1、基本思想

快速排序的基本思想：挖坑填数+分治法。

首先选一个轴值(pivot，也有叫基准的)，通过一趟排序将待排记录分隔成独立的两部分，其中一部分记录的关键字均比另一部分的关键字小，则可分别对这两部分记录继续进行排序，以达到整个序列有序。 


2、算法描述

快速排...]]></description><category></category></item><item><title><![CDATA[排序算法之堆排序]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/80299639</link><guid>https://blog.youkuaiyun.com/shenso/article/details/80299639</guid><author>shenso</author><pubDate>Sun, 13 May 2018 15:29:03 +0800</pubDate><description><![CDATA[1991年的计算机先驱奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德(Robert W．Floyd) 和威廉姆斯(J．Williams) 在1964年共同发明了著名的堆排序算法(Heap Sort).

堆的定义如下：nn个元素的序列 {k1,k2,⋅⋅⋅,kn}{k1,k2,···,kn} 当且仅当满足下关系时，称之为堆。 
 
把此序列对应的二维数组看成一个完全二叉树。那么堆的含义就是：...]]></description><category></category></item><item><title><![CDATA[排序算法之希尔排序]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/80299119</link><guid>https://blog.youkuaiyun.com/shenso/article/details/80299119</guid><author>shenso</author><pubDate>Sun, 13 May 2018 14:30:37 +0800</pubDate><description><![CDATA[希尔排序是希尔（Donald Shell）于1959年提出的一种排序算法。希尔排序也是一种插入排序，它是简单插入排序经过改进之后的一个更高效的版本，也称为缩小增量排序，同时该算法是冲破O(n2）的第一批算法之一。本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现。

基本思想

希尔排序是把记录按下标的一定增量分组，对每组使用直接插入排序算法排序；随着增量逐渐减少，每组包含的关键词越来越多，...]]></description><category></category></item><item><title><![CDATA[排序算法之3种简单排序 - 选择、冒泡、直接插入]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/80298127</link><guid>https://blog.youkuaiyun.com/shenso/article/details/80298127</guid><author>shenso</author><pubDate>Sun, 13 May 2018 11:58:49 +0800</pubDate><description><![CDATA[排序是数据处理中十分常见且核心的操作，虽说实际项目开发中很小几率会需要我们手动实现，毕竟每种语言的类库中都有n多种关于排序算法的实现。但是了解这些精妙的思想对我们还是大有裨益的。本文简单温习下最基础的三类算法：选择，冒泡，插入。

先定义个交换数组元素的函数，供排序时调用



/**
     * 交换数组元素
     * @param arr
     * @param a
     * @...]]></description><category></category></item><item><title><![CDATA[初识Java垃圾回收]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/80274110</link><guid>https://blog.youkuaiyun.com/shenso/article/details/80274110</guid><author>shenso</author><pubDate>Thu, 10 May 2018 21:37:23 +0800</pubDate><description><![CDATA[垃圾回收机制是 Java 非常重要的特性之一，也是面试题的常客。它让开发者无需关注空间的创建和释放，而是以守护进程的形式在后台自动回收垃圾。这样做不仅提高了开发效率，更改善了内存的使用状况。

本文将从以下几个方面对垃圾回收机制进行讲解，希望读完可以对垃圾回收有个初步认识。



一、什么是Java堆内存

堆是在 JVM 启动时创建的，主要用来维护运行时数据，如运行过程中创建的对象和数组都是基于...]]></description><category></category></item><item><title><![CDATA[微服务架构设计]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/80259595</link><guid>https://blog.youkuaiyun.com/shenso/article/details/80259595</guid><author>shenso</author><pubDate>Wed, 09 May 2018 21:05:01 +0800</pubDate><description><![CDATA[一、微服务概述



1、什么是微服务？

微服务就是一些可独立运行、可协同工作的小的服务。

从概念中我们可以提取三个关键词：可独立运行、可协同工作、小。这三个词高度概括了微服务的核心特性。下面我们就对这三个词作详细解释。


可独立运行 
微服务是一个个可以独立开发、独立部署、独立运行的系统或者进程。
可协同工作 
采用了微服务架构后，整个系统被拆分成多个微服务，这些服务之间往往不是完全独立的...]]></description><category></category></item><item><title><![CDATA[对JAVA集合进行遍历删除]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/80247606</link><guid>https://blog.youkuaiyun.com/shenso/article/details/80247606</guid><author>shenso</author><pubDate>Tue, 08 May 2018 23:29:50 +0800</pubDate><description><![CDATA[本文转自对JAVA集合进行遍历删除时务必要用迭代器 


有以下代码：

public static void main(String args[]) {
    List&amp;lt;String&amp;gt; famous = new ArrayList&amp;lt;String&amp;gt;();
    famous.add(&quot;liudehua&quot;);
    famous.add(&quot;madehua&quot;);
    ...]]></description><category></category></item><item><title><![CDATA[CSRF 攻击]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/80247371</link><guid>https://blog.youkuaiyun.com/shenso/article/details/80247371</guid><author>shenso</author><pubDate>Tue, 08 May 2018 23:02:10 +0800</pubDate><description><![CDATA[本文转自CSRF 攻击的应对之道

CSRF 背景与介绍

CSRF（Cross Site Request Forgery, 跨站域请求伪造）是一种网络的攻击方式，它在 2007 年曾被列为互联网 20 大安全隐患之一。其他安全隐患，比如 SQL 脚本注入，跨站域脚本攻击等在近年来已经逐渐为众人熟知，很多网站也都针对他们进行了防御。然而，对于大多数人来说，CSRF 却依然是一个陌生的概念。即便是大...]]></description><category></category></item><item><title><![CDATA[Java服务端性能优化的常见方案]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/80204160</link><guid>https://blog.youkuaiyun.com/shenso/article/details/80204160</guid><author>shenso</author><pubDate>Sat, 05 May 2018 11:35:23 +0800</pubDate><description><![CDATA[作为一个Java后端开发，我们写出的大部分代码都决定着用户的使用体验。如果我们的后端代码性能不好，那么用户在访问我们的网站时就要浪费一些时间等待服务器的响应，造成极差的用户体验，这就可能导致用户投诉甚至用户的流失。

性能优化是一个很大的话题。《Java程序性能优化》说性能优化包含五个层次：设计调优、代码调优、JVM调优、数据库调优、操作系统调优等。而每一个层次又包含很多方法论和最佳实践。本文只举...]]></description><category></category></item><item><title><![CDATA[HashMap的死循环-HashMap Infinite Loop]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/80173739</link><guid>https://blog.youkuaiyun.com/shenso/article/details/80173739</guid><author>shenso</author><pubDate>Wed, 02 May 2018 23:22:29 +0800</pubDate><description><![CDATA[问题的症状

从前我们的Java代码因为一些原因使用了HashMap这个东西，但是当时的程序是单线程的，一切都没有问题。后来，我们的程序性能有问题，所以需要变成多线程的，于是，变成多线程后到了线上，发现程序经常占了100%的CPU，查看堆栈，你会发现程序都Hang在了HashMap.get()这个方法上了，重启程序后问题消失。但是过段时间又会来。而且，这个问题在测试环境里可能很难重现。



Ha...]]></description><category></category></item><item><title><![CDATA[解读Java中的clone方法]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/80101190</link><guid>https://blog.youkuaiyun.com/shenso/article/details/80101190</guid><author>shenso</author><pubDate>Thu, 26 Apr 2018 22:44:41 +0800</pubDate><description><![CDATA[对象的创建

clone顾名思义就是复制， 在Java语言中， clone方法被对象调用，所以会复制对象。所谓的复制对象，首先要分配一个和源对象同样大小的空间，在这个空间中创建一个新的对象。那么在java语言中，有几种方式可以创建对象呢？


使用new操作符创建一个对象
使用clone方法复制一个对象


那么这两种方式有什么相同和不同呢？ new操作符的本意是分配内存。程序执行到new操作符时...]]></description><category></category></item><item><title><![CDATA[从String源码看-为什么JDK中的String不可变]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/80100751</link><guid>https://blog.youkuaiyun.com/shenso/article/details/80100751</guid><author>shenso</author><pubDate>Thu, 26 Apr 2018 22:10:28 +0800</pubDate><description><![CDATA[什么是不可变对象？

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我们都知道， 在Java中， String类是不可变的。那么到底什么是不可变的对象呢？ 可以这样认为：如果一个对象，在它创建完成之后，不能再改变它的状态，那么这个对象就是不可变的。不能改变状态的意思是，不能改变对象内的成员变量，包括基本数据类型的值不能改变，引用类型的变量不能指向其他的对象，引...]]></description><category></category></item><item><title><![CDATA[重写equals()方法就必须重写hashCode()方法]]></title><link>https://blog.youkuaiyun.com/shenso/article/details/80087921</link><guid>https://blog.youkuaiyun.com/shenso/article/details/80087921</guid><author>shenso</author><pubDate>Thu, 26 Apr 2018 00:04:58 +0800</pubDate><description><![CDATA[&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;最近看了Object类的源码，对hashCode() 和equals()方法有了更深的认识。重写equals()方法就必须重写hashCode()方法的原因，需要从源头Object类讲起。



public native int hashCode();

public boolean equals(Object ...]]></description><category></category></item></channel></rss>