<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[wu137789的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/wu137789</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; wu137789]]></copyright><item><title><![CDATA[Quartz的简单使用：实现简单的定时任务]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/139859254</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/139859254</guid><author>wu137789</author><pubDate>Fri, 21 Jun 2024 13:51:11 +0800</pubDate><description><![CDATA[以上示例展示了如何在 Quartz 中配置和调度两个独立的 Job。定义 Job 类：每个 Job 类实现Job接口并定义具体的业务逻辑。配置调度器：为每个 Job 创建JobDetail和Trigger，然后将它们注册到调度器中。启动调度器：调用方法启动调度器，使其开始根据触发器的配置执行 Job。通过这种方式，你可以轻松地管理和调度多个任务。]]></description><category></category></item><item><title><![CDATA[PageHelper：]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/139699865</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/139699865</guid><author>wu137789</author><pubDate>Sat, 15 Jun 2024 11:57:38 +0800</pubDate><description><![CDATA[PageHelper通过MyBatis的拦截器机制在查询执行前动态修改SQL语句，以便添加分页功能。它极大地简化了分页查询的实现，只需在查询前调用设置分页参数，之后的查询操作将自动应用分页。这种方式不仅避免了手动编写复杂的分页SQL，也使代码更加简洁和可维护。]]></description><category></category></item><item><title><![CDATA[@Autowired和@Resource的区别：]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/139686048</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/139686048</guid><author>wu137789</author><pubDate>Fri, 14 Jun 2024 17:05:26 +0800</pubDate><description><![CDATA[Autowired和@Resource。]]></description><category></category></item><item><title><![CDATA[java实习--Day02：]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/139563008</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/139563008</guid><author>wu137789</author><pubDate>Sun, 09 Jun 2024 16:13:54 +0800</pubDate><description><![CDATA[然后就是晚上要求交周报，可能由于公司的不同，有些公司要求是交日报，有些公司是交周报。由于是第一次交周报，没经验、而且就来了两天，因此周报就写了寥寥几句话。后面leader看完周报便提醒我，周报要尽量写清楚，例如：你不能只写一句熟悉公司业务，要具体写熟悉了公司的哪些业务，尽量写清楚一些。第二天leader还是让我开文档熟悉公司业务。下午，leader带着我去跟需求开会，由于第一次听需求，啥也不懂直接一屁股干到大屏下面，导致整个会议两小时都是侧着抬着头看屏幕，因此开会时各位应当坐的里显示大屏远一些。]]></description><category></category></item><item><title><![CDATA[java实习--Day01]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/139550720</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/139550720</guid><author>wu137789</author><pubDate>Sat, 08 Jun 2024 20:20:08 +0800</pubDate><description><![CDATA[办理好入职手续后，大概就是我小组的leader安排我坐在一个空的工位上，leader很热情，先是给我发了一堆账号，让我登录，由于当时组内很忙，leader也没时间管我，于是就给了一份公司业务文档让我先熟悉业务，后续又给了一份项目代码给我熟悉。然后，组内的大哥们就在那讨论业务和敲代码，我就被晾在一旁看文档和代码了。]]></description><category></category></item><item><title><![CDATA[jstat、jmap、jstack的区别]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/138509748</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/138509748</guid><author>wu137789</author><pubDate>Mon, 06 May 2024 21:56:04 +0800</pubDate><description><![CDATA[总的来说，jstat用于监视虚拟机的统计信息，jstack用于生成线程堆栈快照，而jmap用于生成堆转储文件，每个工具都有其特定的用途和作用范围。: jmap主要用于生成Java堆的转储文件（heap dump），可以用于分析Java应用程序的内存使用情况，帮助发现内存泄漏等问题。: jstack主要用于生成Java虚拟机线程快照，可以用于查看Java应用程序中线程的堆栈信息，帮助诊断线程相关的问题，比如死锁。: jstat主要用于监视Java虚拟机的统计信息，包括类加载、垃圾回收、编译等方面的信息。]]></description><category></category></item><item><title><![CDATA[ThreadLocal：]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/138498676</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/138498676</guid><author>wu137789</author><pubDate>Mon, 06 May 2024 16:16:21 +0800</pubDate><description><![CDATA[当我们储存线程本地数据的时候，会以threadlocal作为map的key值，传入的值作为value存入threadlocalmap当中。但是我们需要注意的是map当中的key指向threadlocal的引用是弱引用，而map当中的value指向数据的引用是强引用，也就是说如果threadlocal引用消失之后，threadlocal对象就会被GC回收，而value的值则不会，因为线程对象还存在。ThreadLocal是一个类，他能够为线程存储线程本地变量，这种变量是线程独有的，不会影响其他的线程。]]></description><category></category></item><item><title><![CDATA[TCP可靠传输：]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/138476938</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/138476938</guid><author>wu137789</author><pubDate>Sun, 05 May 2024 23:33:33 +0800</pubDate><description><![CDATA[奇偶检验：就是发送方和接收端设定一个规定，规定传输的信息数据当中的“1”的个数是奇数个或者是偶数个，并在发送端TCP报文段附加位上补上1或者是0，使得数据满足数据中1的个数是奇数个或者是偶数个的要求。这样如果数据在传输过程当中部分的数据编码发生的异变，接收端就能够及时的发现错误。当如果以这种方式作为校验方式有一定的误差，有可能数据段上同时有两位数据发生了异变，那么接收端就无法判断数据传输过程中出现了错误。]]></description><category></category></item><item><title><![CDATA[使用 fork() 系统调用创建一个子进程时，子进程会继承父进程的什么信息?]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/138473114</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/138473114</guid><author>wu137789</author><pubDate>Sun, 05 May 2024 20:29:29 +0800</pubDate><description><![CDATA[但是这样就会产生问题：如果父进程不调用wait或waitpid的话，那么保留的信息就不会被释放，其进程号就会被一直占用，但是系统所能使用的进程号是有限的，如果大量产生僵死进程，将因没有可用的进程号而导致系统无法产生新的进程，这就是僵尸进程的危害。，是指一个进程使用fork函数创建子进程，如果子进程退出，而父进程并没有调用wait()或者waitpid()系统调用取得子进程的终止状态，那么子进程的进程描述符仍然保存在系统中，占用系统资源，这种进程称为僵尸进程。父进程对某文件加了把锁，子进程不会继承这把锁。]]></description><category></category></item><item><title><![CDATA[ID自增策略：]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/138452355</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/138452355</guid><author>wu137789</author><pubDate>Sat, 04 May 2024 22:43:10 +0800</pubDate><description><![CDATA[Leaf是美团开源的分布式ID生成器，能保证全局唯一，趋势递增，但需要依赖关系数据库、Zookeeper等中间件。人为系统将时间进行回拨，要使得多台机器进行同步，需要等待时间慢的机器就需要进行时间回拨。占用10bit，其中高位5bit是数据中心ID，低位5bit是工作节点ID，做多可以容纳1024个节点。占用12bit，每个节点每毫秒0开始不断累加，最多可以累加到4095，一共可以产生4096个ID。雪花算法，它是Twitter开源的由64位整数组成分布式ID，性能较高，并且在单机上递增。]]></description><category></category></item><item><title><![CDATA[操作系统复习DAY06--文件管理、内存映射文件]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/138452182</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/138452182</guid><author>wu137789</author><pubDate>Sat, 04 May 2024 22:40:32 +0800</pubDate><description><![CDATA[因此这里引入了索引节点，在索引节点的目录项当中我们只储存文件名和索引节点的指针，只有当文件是我们所需要的文件时我们才会将索引节点的信息传入内存当中，索引节点当中储存了文件的各种信息。在传统的文件访问当中，一个进程如果需要访问一个文件，首先需要进程从磁盘当中将文件当中所需要的数据读取到进程的虚拟内存空间当中，然后如果对数据进行了修改，那么便需要现在内存当中修改数据，然后再将更新之后的值手动指令加载进磁盘当中。每个文件都有自己的FCB，需要注意的是目录也是一种特殊的文件。我们常见的.txt文件就是无结构文件。]]></description><category></category></item><item><title><![CDATA[JWT（token）：]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/138427762</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/138427762</guid><author>wu137789</author><pubDate>Fri, 03 May 2024 23:33:18 +0800</pubDate><description><![CDATA[alg：指定signature采用的加密算法，默认是HS256，对称加密（加密和解密的密钥相同）JWT登出的实现：用黑名单，但这个违背了JWT无状态的初心，但没有其他更好的办法。设置一个secretKey，通过将前两个结果合并后进行HS256算法。secreKey一定不能暴露，因为可以颁发token，也可以解密。默认携带iat，令牌签发时间（时间戳）通过base64Url算法进行编码。通过base64Url算法进行编码。typ：固定值，通常是JWT。exp设置令牌过期时间。]]></description><category></category></item><item><title><![CDATA[操作系统复习：DAY05--段页式管理，虚拟内存管理]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/138427674</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/138427674</guid><author>wu137789</author><pubDate>Fri, 03 May 2024 23:31:35 +0800</pubDate><description><![CDATA[我们所玩的游戏就是如此，一个大一点的游戏就有几十个G，而我们电脑的内存只有8G或者是16G无法将全部的游戏数据全部加载进内存当中，因此这里使用的就是虚拟内存技术，只是将一部分CPU运行需要的数据加载进了内存当中，当需要其他数据资源的时候，才会将新数据加载进内存当中。在之前的32位CPU架构中，内存管理使用的是段页式管理，因此需要先通过逻辑地址中的段号对照段表求出线性地址，然后根据逻辑地址当中的页表+页号对照页表项页表和页内偏移地址求出数据的物理地址。这是最常用的实现虚拟内存的技术。]]></description><category></category></item><item><title><![CDATA[GET请求和POST请求之间的区别：]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/138402834</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/138402834</guid><author>wu137789</author><pubDate>Thu, 02 May 2024 23:19:22 +0800</pubDate><description><![CDATA[缓存上：浏览器会对GET请求得数据进行缓存，如果浏览器对同一个URL进行GET访问时，第二次会直接从缓存中获取数据。而POST没有缓存。数据传输的方式：GET是放在URL路径?后面的每个参数用&进行连接，具有大小限制。而POST数据是放在请球体里面的，没有大小限制。安全性：GET请求是明文的，而POST请求中的数据放在请求体里面，相对来讲更加的安全。GET和POST都是HTTP协议中最常用的两种请求方式。]]></description><category></category></item><item><title><![CDATA[操作系统复习DAY04 --内存管理连续分配、基本分页管理]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/138402750</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/138402750</guid><author>wu137789</author><pubDate>Thu, 02 May 2024 23:17:44 +0800</pubDate><description><![CDATA[静态重定位：在编译过后得到的可执行文件当中的数据地址还是逻辑地址，但当这些可执行文件加载进内存后，数据地址便会进行重定位，也就是会为数据地址加上内存的初始值。（这种方式，需要操作系统为其分配完整连续的内存，不能够进行分割，因为不同的模块存在不同的地址上时，模块的初始地址就不一样了，那么在加载进内存时逻辑地址转换位物理地址的时候，初始地址就无法正确确定）然后执行指令2，根据指令2当中的类型参数，判断该指令是加法指令，便会让CPU寄存器当中的值也就是x与相对应的值1进行相加，并将结果写进寄存器。]]></description><category></category></item><item><title><![CDATA[==和equals的区别：]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/138382214</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/138382214</guid><author>wu137789</author><pubDate>Wed, 01 May 2024 23:10:59 +0800</pubDate><description><![CDATA[而equals是Object类的一个方法，由于所有得java类都继承了Object类，因此所有的类都拥有equals方法。在没有重写equals方法的情况下，equals方法底层调用的其实也是==，来判断对象是否相等，也就是利用两个对象在对空间中的地址是否相同来判断。==是一种运算符，当==在比较基本数据类型的时候会直接比较那些数据的值是否相等，如果值相等则返回true，否则返回false。当==在比较引用类型的时候，会比较两者在堆中的地址是否相同，相同则返回true，否则返回false。]]></description><category></category></item><item><title><![CDATA[hash冲突的解决方案]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/138381991</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/138381991</guid><author>wu137789</author><pubDate>Wed, 01 May 2024 22:59:18 +0800</pubDate><description><![CDATA[双重哈希法，就是在原始的hash函数之上，再增加一个hash函数原来计算探测步长，第二个hash函数必须与第一个hash函数不同，同时要求探测步长不能是0。两种方法的比较： 插入过程中，开放地址法是先计算出hash值，然后依次寻找其他空白的位置，而hashmap是先计算出hash值，然后将其插入所对应的链表之中。查找过程中，开放地址法是先计算出hash值，若在该位置为寻找到对应的值，便会依次寻找其他位置，直到寻找到值，而hashmap是先计算出hash值，然后在对应的链表之中寻找。]]></description><category></category></item><item><title><![CDATA[HashMap的并发问题]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/138381970</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/138381970</guid><author>wu137789</author><pubDate>Wed, 01 May 2024 22:58:25 +0800</pubDate><description><![CDATA[在扩容时，会首先创建一个长度是原来数组长度两倍的数组，然后在通过transfer（）方法，首先将原来map中桶中的元素都重新hash一遍得到新的hash值，然后将元素放入到新数组对应的数组下标当中。然后，第一个线程接着执行，首先会将A放到第一个线程创建新数组当中，然后再接着将B放入新数组当中，执行到这个时候，e就指向了A，next指向了null，而数组桶中的第一个元素就是B，接着A的next指针便就会指向桶中第一个元素也就是B，那么此时循环就形成了A的next指向B，B的next指向A。]]></description><category></category></item><item><title><![CDATA[操作系统复习--DAY03 调度]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/138359311</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/138359311</guid><author>wu137789</author><pubDate>Tue, 30 Apr 2024 23:05:47 +0800</pubDate><description><![CDATA[中级调度（内存调度）：由于系统的内存有限，因此有可能会将一些处于内存当中的进程由内存当中放入外存当中，当CPU需要执行的时候再从外存当中将该进程的信息从外存当中加载进内存当中。被放入外存当中的进程会处于挂起的状态，由挂起队列连接这些被挂起的进程。高级调度（作业调度）：面向作业而言，由于操作系统的内存有限，因此无法所有的任务都加载进内存当中，因此只能够将部分作业或者说是任务加载进内存当中，然后创建进程。进程切换：将原来的进程的上下文储存进PCB当中，将新进程的上下文加载进CPU当中。]]></description><category></category></item><item><title><![CDATA[操作系统复习：DAY02--进程、线程]]></title><link>https://blog.youkuaiyun.com/wu137789/article/details/138359173</link><guid>https://blog.youkuaiyun.com/wu137789/article/details/138359173</guid><author>wu137789</author><pubDate>Tue, 30 Apr 2024 23:02:49 +0800</pubDate><description><![CDATA[于是A进程向B进程发送的msg便会进入B进程PCB块中的消息队列当中，B进程然后便可以使用原语receive（A，&msg）接收到A进程发送过来的消息msg。间接通信方式：进程A中创建msg，然后使用原语send（M，msg）往信箱M中发送消息msg，之后进程B便能够使用原语，receive（A，&msg）从信箱M中接收到消息。一个父进程会给自己的子进程分配一定的资源，这些进程与进程之间的资源关系就是树形的结构。：包括进程使用的内存空间分配情况，如基址、界限寄存器的值，或页表信息等。]]></description><category></category></item></channel></rss>