<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[LemonSnm的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/LemonSnm</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; LemonSnm]]></copyright><item><title><![CDATA[Nginx负载均衡]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/125342464</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/125342464</guid><author>LemonSnm</author><pubDate>Wed, 22 Jun 2022 00:42:56 +0800</pubDate><description><![CDATA[Nginx负载均衡]]></description><category></category></item><item><title><![CDATA[分布式消息中间件设计]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/125325163</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/125325163</guid><author>LemonSnm</author><pubDate>Thu, 16 Jun 2022 23:30:21 +0800</pubDate><description><![CDATA[分布式消息中间件设计]]></description><category></category></item><item><title><![CDATA[java锁相关]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/123422952</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/123422952</guid><author>LemonSnm</author><pubDate>Fri, 11 Mar 2022 13:59:38 +0800</pubDate><description><![CDATA[自旋锁：为了不放弃CPU执行事件，循环的使用ACS技术对数据尝试进行更新，直至成功。

悲观锁：假定会发生并发冲突，同步所有对数据的相关操作，从读数据就开始上锁。

乐观锁：假定没有冲突，在修改数据时如果发现数据和之前获取的不一致，则读最新数据，修改为最新后重新修改数据。

独享锁（写）：给资源加上写锁，线程可以修改资源，其他线程不能再加锁。（单个线程写）

共享锁（读）：给资源加上读锁后只能读不能改，其他线程也只能加读锁，不能加写锁；（多读）。

可重入锁、不可重入锁：线程拿到一把锁之后，可以自由进入同.]]></description><category></category></item><item><title><![CDATA[线程安全-原子操作]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/122324357</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/122324357</guid><author>LemonSnm</author><pubDate>Wed, 05 Jan 2022 16:34:00 +0800</pubDate><description><![CDATA[1、
]]></description><category></category></item><item><title><![CDATA[java基础-线程池应用及实现原理]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/122255338</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/122255338</guid><author>LemonSnm</author><pubDate>Tue, 04 Jan 2022 16:45:43 +0800</pubDate><description><![CDATA[1、线程池原理

1.1、为什么要用线程池

线程是不是越多越好？


①线程在java中是一个对象，更是操作系统的资源，线程的创建、销毁需要时间。如果创建时间+销毁时间&gt;执行任务的时间。就很不划算。

②java对象占用堆内存，操作系统线程占用系统内存，根据jvm规范，一个线程默认最大栈大小1M，这个栈空间是需要从系统内存中分配的。线程过多，会消耗很多的内存。

③操作系统需要频繁切换线程上下文（大家都想被运行），影响性能。

线程池的推出，就是为了方便的控制线程的数量。


2、线程池原理-概念
]]></description><category></category></item><item><title><![CDATA[java基础-线程封闭]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/122251312</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/122251312</guid><author>LemonSnm</author><pubDate>Fri, 31 Dec 2021 11:54:31 +0800</pubDate><description><![CDATA[封闭对应的是开放，所谓线程开放就是类似共享数据、共享变量这些概念。

多线程访问共享可变数据时，涉及到线程间数据同步问题。并不是所有时候，都要用到共享数据，所以线程封闭的概念就提出来了。


线程封闭的概念


数据都封闭在各自的线程之中，就不需要同步了。这种通过将数据封闭在线程中而避免使用同步的技术称为线程封闭。

线程封闭的具体体现：ThreadLocal、局部变量。


ThreadLocal


ThreadLocal是java里一种特殊的变量。

它是一个线程级别变量，每个线程都有一个Thre..]]></description><category></category></item><item><title><![CDATA[java基础-线程通信]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/122219055</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/122219055</guid><author>LemonSnm</author><pubDate>Thu, 30 Dec 2021 18:20:00 +0800</pubDate><description><![CDATA[1、通信的方式：

要想实现多个线程之间的协同，如：线程的执行顺序、获取某个线程的执行结果等。

涉及到线程之间的通信，分为下面四类：


①文件共享

②网络共享

③共享变量

④JDK提供的线程协调API：suspend/resume、wait/notify、park/unpark


1.1文件共享


线程1写数据到文件里，线程2读取文件中的数据内容，实现数据的交换




代码示例：


import java.nio.file.Files;
import java.nio.file.Pat..]]></description><category></category></item><item><title><![CDATA[java基础-内存屏障和CPU缓存]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/122190411</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/122190411</guid><author>LemonSnm</author><pubDate>Wed, 29 Dec 2021 16:27:04 +0800</pubDate><description><![CDATA[1、CPU性能优化-缓存


为了提高程序的运行性能，现代CPU在很多方面对程序进行了优化。

例如，高速缓存。尽可能的避免处理器访问主内存的时间开销，处理器大多会利用缓存来提高性能。访问速度：cup处理器的缓存&gt;内存&gt;硬盘


2、CPU的三级缓存



L1Cache（一级缓存）是CPU第一级高级缓存，分为数据缓存和指令缓存。一般服务器CPU的L1缓存容量通常在32-4096KB.

L2由于L1级高速缓存的容量限制，为了再次提高CPU的运算速度，在CPU外部放置一高速存储器，即二级缓存。.]]></description><category></category></item><item><title><![CDATA[java基础—线程中止]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/122131758</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/122131758</guid><author>LemonSnm</author><pubDate>Tue, 28 Dec 2021 11:50:16 +0800</pubDate><description><![CDATA[不正确的线程终止-Stop


Stop：终止线程。并且清除监控器锁信息，但是可能导致线程安全问题，JDK不建议用。

Destroy：JDK并未实现该方法。


]]></description><category></category></item><item><title><![CDATA[java基础-线程状态]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/122122650</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/122122650</guid><author>LemonSnm</author><pubDate>Fri, 24 Dec 2021 16:46:15 +0800</pubDate><description><![CDATA[目录

1、线程的六种状态定义：

2、线程的六种状态之间的切换流程图：

1、线程的六种状态定义


①New（新建状态）：尚未启动的线程的线程状态。

（通俗的说就是我们写了一个线程，还未调用start方法去启动这个线程）

②Runnable（可运行状态）：可运行线程的线程状态，等待CUP调度。

（通俗讲就是，线程调用了start方法之后进入该状态）。Runnable状态分两种：1、CPU正在执行这个线程；2、CPU随时可以调度执行该线程的状态

③Blocked（阻...]]></description><category></category></item><item><title><![CDATA[java基础-java运行原理]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/122096813</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/122096813</guid><author>LemonSnm</author><pubDate>Fri, 24 Dec 2021 01:49:30 +0800</pubDate><description><![CDATA[Class文件内容：


class文件包含JAVA程序执行的字节码，数据按照格式紧凑排列在class文件中的二进制流，中间没有任何分割符；文件开头有一个0xcafebabe(16进制）特殊的标志




上图展示16进制的class文件内容


这个文件有着复杂的格式，专门给JVM读取里面的内容，人阅读需要借助工具查看。

内容包含：版本、访问标志、常量池、当前类、超级类、接口、字段、方法、属性。


JVM运行时数据区：




线程独占：每个线程都会有它的独立空间，随线程生命周期而创建和销毁。...]]></description><category></category></item><item><title><![CDATA[java高级工程师学习之路 -目录]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/122096381</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/122096381</guid><author>LemonSnm</author><pubDate>Wed, 22 Dec 2021 22:25:56 +0800</pubDate><description><![CDATA[1、高性能编程

2、中间件

3、容器化技术

4、分布式系统

5、后端项目实战

6、商业化

7、项目分享



1、高性能编程



2、中间件



3、容器化技术



4、分布式系统



5、后端项目实战



6、商业化



7、项目分享
...]]></description><category></category></item><item><title><![CDATA[序列化与反序列化]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/119776462</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/119776462</guid><author>LemonSnm</author><pubDate>Wed, 22 Dec 2021 22:03:37 +0800</pubDate><description><![CDATA[1、序列化的意义：


①如何远程传输对象（java对象）？

②序列化带来的性能如何优化？


什么是序列化与反序列化？

java允许在内存中创建可复用的java对象，但是只有jvm运行的时候，这个对象才存在。jvm停了，内存中的对象也没了。


序列化：把对象的状态信息转换为可存储、可传输的可视化数据。

反序列化：把可存储、可传输的可视化数据转换为java对象


序列化的作用：


1、服务器与服务器之前传输对象：ServerA序列化对象 远程通信传给ServerB,ServerB反序列化成对..]]></description><category></category></item><item><title><![CDATA[使用ajax将js对象数组传给java后台服务器]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/110393832</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/110393832</guid><author>LemonSnm</author><pubDate>Mon, 30 Nov 2020 18:02:49 +0800</pubDate><description><![CDATA[前端页面js写法：



        var objectArray=[];
        for(var i=0;i&lt;3;i++) {

                var data = {
                    examineeId: 1,
                    workTypeId: 2,
                    classIdArray: 3
                };
                objectArra]]></description><category></category></item><item><title><![CDATA[微信小程序引入原生组件——WeUI组件库，详细步骤]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/108259207</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/108259207</guid><author>LemonSnm</author><pubDate>Thu, 27 Aug 2020 15:49:46 +0800</pubDate><description><![CDATA[第一步：查看是否可使用npm命令，没有则安装：




我这里已经安装了，如果没有则安装node.js


node官网下载地址：https://nodejs.org/en/


注意这个windows 64位的：


其他系统看这里：点击dowloads



先点击LTS，下面可选 32位或者64位的




下载好安装包，一路next即可。


终端输入 npm -v ，看见版本号 即安装成功



第二步：微信开发工具，打开微信小程序项目，没有就新建一个：

这里我就新建一个 小程序项目：...]]></description><category></category></item><item><title><![CDATA[互联网系统架构的演进过程]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/107646405</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/107646405</guid><author>LemonSnm</author><pubDate>Thu, 20 Aug 2020 21:28:06 +0800</pubDate><description><![CDATA[以一个网站为例：


网站一开始就是大型的吗？

我们应该一开始就设计一个大型网站吗?


①不知名小网站 -&gt; 低访问量，一台服务器满足需求。




快速推出这个小网站，让人们认识到这个很有价值。

最快速的技术LAMP：Linux+Apache+MySQL+PHP


②随着网站的发展，越来越多的用户访问，面临问题：


性能越来越差

越来越多的数据导致存储空间不足


选择解决方式：应用服务与数据服务分离




原来一台服务器做全部事情，现在三台服务器分别做不同模块的事。


能带来什么好]]></description><category></category></item><item><title><![CDATA[浏览器自动填充保存的账号密码]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/107210263</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/107210263</guid><author>LemonSnm</author><pubDate>Wed, 08 Jul 2020 17:22:41 +0800</pubDate><description><![CDATA[1、禁止浏览器表单自动填充


一般文本框添加 autocomplete="off" 或者autocomplete="new-text"

密码输入框添加 autocomplete="new-password"



&lt;input type="text" autocomplete="off" name="userName"/&gt;

&lt;input type="password" autocomplete="new-password" name="password"/&gt;

...]]></description><category></category></item><item><title><![CDATA[layui 数据表格选择框 部分不可选]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/107187501</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/107187501</guid><author>LemonSnm</author><pubDate>Tue, 07 Jul 2020 18:26:10 +0800</pubDate><description><![CDATA[直接上代码：

layui数据表格部分代码


    , page: true //是否显示分页
            , limits: [10, 20, 50, 100]
            , limit: 10 //每页默认显示的数量
            , id: "tableReload"
            , where: {}
            , text: {
                none: '暂无相关数据'
            },
      ]]></description><category></category></item><item><title><![CDATA[Layui 数据表格左右固定 ，内容换行为两行。且有字段隐藏]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/106668070</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/106668070</guid><author>LemonSnm</author><pubDate>Wed, 10 Jun 2020 15:46:46 +0800</pubDate><description><![CDATA[效果图：




设置每行的css：



&lt;style type="text/css"&gt;
    {# 设置table每一行的height #}
    .layui-table-cell {
        height: 50px;
    }
    {# 设置table每一行的复选框居中 #}
    .layui-table-fixed-l i{
        margin-top: 21px;
    }
&lt;/style&gt;

layui渲染表格时进行设置：


  .]]></description><category></category></item><item><title><![CDATA[Springboot下使用easyExcel玩转Excel表的导入]]></title><link>https://blog.youkuaiyun.com/LemonSnm/article/details/106663749</link><guid>https://blog.youkuaiyun.com/LemonSnm/article/details/106663749</guid><author>LemonSnm</author><pubDate>Wed, 10 Jun 2020 13:56:09 +0800</pubDate><description><![CDATA[Springboot下使用easyExcel玩转Excel表的导出

https://blog.youkuaiyun.com/LemonSnm/article/details/106394075


在前面的导出项目里继续添加导入工，直接放代码：

1、写导入监听器EasyExcelListener（这里直接封装成模板类）


该监听器可以验证

①导入excel表模板的表头是否正确

②导入的数据类型是否正确

③若错误 返回错误位置信息

④正确导入，则返回对应的List&lt;&gt;集合

⑤返回的最终结果..]]></description><category></category></item></channel></rss>