<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[SunStaday的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/SunStaday</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; SunStaday]]></copyright><item><title><![CDATA[Spring MVC]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/112462733</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/112462733</guid><author>SunStaday</author><pubDate>Mon, 11 Jan 2021 10:43:38 +0800</pubDate><description><![CDATA[Spring MVCSpring MVC介绍Spring MVC框架Spring MVC的运行原理Spring MVC 中各组件的介绍前端控制器（DispatchServlet）处理器映射器（HandlerMapping）处理器适配器（HandlerAdapter）处理器（Handler）视图解析器（View Resolver）视图（View）
Spring MVC介绍
JavaEE体系结构包括四层，从上到下分别是应用层、Web层、业务层、持久层。Struts和SpringMVC是Web层的框架，Sprin]]></description><category></category></item><item><title><![CDATA[Spring DI]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/112433425</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/112433425</guid><author>SunStaday</author><pubDate>Sun, 10 Jan 2021 18:05:15 +0800</pubDate><description><![CDATA[Spring DIDI 依赖注入DI 关键点依赖注入方式基于xml配置文件注入基于有参构造函数注入基于set()方法注入当存在自定义类型属性时，set()方法其他类型的数据注入基于注解注入实现Demo@Resource和@Autowired的区别？依赖的解析过程
DI 依赖注入
DI（Dependency Injection）依赖注入，指容器复制创建和维护对象之间的依赖关系，而不是通过对象本身复制自己的创建和解决自己的依赖。控制反转是通过依赖注入实现的。
其实Ioc和DI在Spring中是一个等同的概念。如]]></description><category></category></item><item><title><![CDATA[Spring IOC 详解]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/112395759</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/112395759</guid><author>SunStaday</author><pubDate>Sat, 09 Jan 2021 19:01:14 +0800</pubDate><description><![CDATA[Spring IOCIOC什么是IOCIOC容器介绍BeanFactory和ApplicationContext的区别Spring容器管理对象Spring依赖（pom.xml）Spring的配置文件Bean类的实例化方式（demo）创建实例类基于xml配置文件实现Bean基于无参构造函数实例化静态工厂方式实例化基于普通工厂方法实例化基于注解的方式装配Beanspring配置文件引入context约束实例类上添加注解
IOC
什么是IOC
Ioc—Inversion of Control，即“控制反转”，不是]]></description><category></category></item><item><title><![CDATA[Redis 持久化]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/109595903</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/109595903</guid><author>SunStaday</author><pubDate>Tue, 10 Nov 2020 12:07:23 +0800</pubDate><description><![CDATA[redis 持久化持久化RDB优点：缺点：RDB底层操作AOF配置AOF的fsync策略AOF产生的问题：RDB和AOF如何选择冷备份
持久化
如果我们将数据存放于内存：高效、断电（关机）内存数据会丢失，但是如果将数据存放于硬盘：读写速度慢于内存，断电数据不会丢失。Redis一共提供了两种能将数据从内存存放到磁盘的方法——RDB、AOF。
RDB
RDB是redis的默认持久化机制。 RDB相当于照快照，保存的是一种状态。 几十G数据经过转二进制和压缩的过程转换伪几KB快照快照是默认的持久化方式。这种方式是]]></description><category></category></item><item><title><![CDATA[Redis 内存维护]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/109595586</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/109595586</guid><author>SunStaday</author><pubDate>Tue, 10 Nov 2020 11:37:51 +0800</pubDate><description><![CDATA[redis 内存维护产生原因内存维护解决方案LRULFULRU与LFU不同点：
产生原因
redis作为中间缓存件，时常会存储大量的数据，即使采取了集群部署来动态扩容，也应该及时的整理内存，维持系统性能。
Redis官方也给出警告，当内存不足时，Redis会根据配置的缓存策略淘汰大部分keys，以保证写入成功。当无淘汰策略时或没有找到合适的key时，Redis直接返回out of memory错误。
内存维护解决方案
最大缓存大小
maxmemory  : 512G
一是为数据设置超时时间，
二是采用LRU]]></description><category></category></item><item><title><![CDATA[Redis基本操作]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/109584171</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/109584171</guid><author>SunStaday</author><pubDate>Mon, 09 Nov 2020 21:56:40 +0800</pubDate><description><![CDATA[RedisRedis 简介非关系型数据库（NOSQL）非关系型数据库的产生背景非关系型数据库的种类键值(Key-Value)存储数据库文档型数据库图形(Graph)数据库Redis特点/优势Redis缺点Redis与Mysql比较Redis 基本操作String类型赋值语法：取值语法：删除语法：自增/自减：应用场景：字典类型赋值语法：取值语法：删除语法：其它语法：应用场景：List类型赋值语法取值语法删除语法修改语法高级语法应用场景Set类型赋值语法：删除语法差集语法交集语法并集语法应用场景有序集合(Sor]]></description><category></category></item><item><title><![CDATA[Linux详解]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/109218605</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/109218605</guid><author>SunStaday</author><pubDate>Thu, 22 Oct 2020 13:17:07 +0800</pubDate><description><![CDATA[Linux初始LinuxLinux简介Linux 和 Windows 的区别什么是 open-vm-tools开机与重启runlevel用户管理添加新用户切换用户修改用户密码删除用户用户信息/etc/passwd 存储用户基本信息/etc/shadow 存储用户的密码/etc/group 存储用户组的信息/etc/gshadow  存储组密码信息Linux目录结构常见目录说明路径当前路径绝对路径与相对路径绝对路径相对路径路径切换Linux 系统下的文件类型与文件权限文件类型文件权限修改文件权限文字设定法数字]]></description><category></category></item><item><title><![CDATA[MySQL入门很简单]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/108074498</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/108074498</guid><author>SunStaday</author><pubDate>Tue, 18 Aug 2020 13:57:36 +0800</pubDate><description><![CDATA[MySQL特殊数据类型插入，更新，删除数据1.插入数据：2.将查询结果插入到表中：3.更新数据：4.删除数据：创建，修改，删除表设置表的主键：设置表的外键：删除表的外键约束：修改表名：修改字段的数据类型：修改字段名和字段数据类型：增加字段：删除字段：删除字段约束条件：修改字段的排列位置：更改表的存储引擎：改动字符集：视图在单表上创建视图：在多表上创建视图：查看视图：修改视图语句：更新视图：删除视图：触发器创建一个由insert出发的触发器：创建多个执行语句的触发器：查看触发器：删除触发器：查询语句带in关键]]></description><category></category></item><item><title><![CDATA[HashMap详解]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/107997813</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/107997813</guid><author>SunStaday</author><pubDate>Fri, 14 Aug 2020 09:58:28 +0800</pubDate><description><![CDATA[HashMap详解1.HashMap的使用：2.HashMap迭代器的使用：1）Key的遍历：2)value的遍历：3)Entry的遍历：4)Interator遍历：3.HashMap的底层源码实现：3.1.HashMap中put()方法：3.2.HashMap之resize()方法3.3.HashMap之get(Object key)方法3.4.HashMap之remove(Object key)方法4.HashMap迭代器实现：5.HashMap与HashTable之间的区别与联系：
1.HashMap]]></description><category></category></item><item><title><![CDATA[HashMap 与 Hashtable 的区别]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/107997134</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/107997134</guid><author>SunStaday</author><pubDate>Fri, 14 Aug 2020 09:40:59 +0800</pubDate><description><![CDATA[\
Hashtable
HashMap




继承父类不同
继承 Dictionary
继承AbstractMap


默认容量
11
16


Table的初始化时间
构造函数中初始化
第一次使用put方法


并发操作
使用同步机制，实际应用程序中，仅仅是Hashtable本身的同步并不能保证程序在并发操作下的正确性，需要高层次的并发保护。下面的代码试图在key所对应的value值等于x的情况下修改value为x+1{value = hashTable.get(key); if(value.i...]]></description><category></category></item><item><title><![CDATA[mysql无法连接到服务解决方法]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/107996854</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/107996854</guid><author>SunStaday</author><pubDate>Fri, 14 Aug 2020 09:05:04 +0800</pubDate><description><![CDATA[MySQL已安装，因长时间不用，不在服务列表中，无法启动，解决办法：
1、以管理员身份执行cmd；
2、切换到mysql安装目录下的bin目录，执行mysqld.exe --install命令，看到service successfully installed.表示安装服务成功。
3、重新执行cmd，输入net start mysql  启动服务


...]]></description><category></category></item><item><title><![CDATA[ConcurrentHashMap底层分析]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/107515835</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/107515835</guid><author>SunStaday</author><pubDate>Wed, 22 Jul 2020 18:12:20 +0800</pubDate><description><![CDATA[ConcurrentHashMap相关概念类的继承关系成员变量构造函数put方法分析第一个判断第二个判断第三个判断

jdk1.8之前，通过segments实现，segments继承ReentrantLock，segments充当锁的角色，每一个table（桶）都有自己的锁，因此jdk1.8之前ConcurrentHashMap采用分段锁的机制来实现并发的更新操作，提高并发效率。
table相当于HashMap中的数组（桶），桶里每一个节点包含键，值，Hash值，称之为HashEntry,用来封装键值对（k]]></description><category></category></item><item><title><![CDATA[synchronized使用情况]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/107473660</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/107473660</guid><author>SunStaday</author><pubDate>Mon, 20 Jul 2020 21:55:20 +0800</pubDate><description><![CDATA[synchronized未加static关键字1）一对象两线程一方法2）两对象两线程一方法3）一对象两线程两方法4）一对象两线程两方法（有一非synchronized方法）加static关键字5）一类一对象两线程两方法（一个方法static修饰，一个没有）6）一类两线程两方法
未加static关键字
1）一对象两线程一方法
两个并发的线程访问同一个类Object中的synchronized同步代码块或者同步方法时，同一时间只能执行一个线程，另一个线程必须等待当前线程执行完才能执行。（等待执行）
import]]></description><category></category></item><item><title><![CDATA[线程间通信及生产者消费者模型]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/107471764</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/107471764</guid><author>SunStaday</author><pubDate>Mon, 20 Jul 2020 20:36:21 +0800</pubDate><description><![CDATA[线程通信线程通信是什么wait()/notify()/notifyAll()await/signal/signalAll生产者消费者模型await/signal/signalAll实现wait/notify/notifyAll实现
线程通信是什么
线程通信的目标是使线程间能够互相发送信号。另一方面，线程通信使线程能够等待其他线程的信号。
例如，线程B可以等待线程A的一个信号，这个信号会通知线程B数据已经准备好了。
wait()/notify()/notifyAll()
必须在synchronized同步代码]]></description><category></category></item><item><title><![CDATA[ReentrantLock详解]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/107451530</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/107451530</guid><author>SunStaday</author><pubDate>Sun, 19 Jul 2020 22:10:12 +0800</pubDate><description><![CDATA[ReentrantLockReentrantLock使用格式底层实现获取锁释放锁公平锁与非公平锁公平锁非公平锁可重入锁与不可重入锁synchronizedReentrantLock可定时性ReentrantLock实现单例ReentrantLock与synchronized的比较相似点区别
ReentrantLock

提供了无条件的，可轮询的，定时的以及可中断的锁获取操作
加锁和解锁都是显式的

ReentrantLock使用格式
  Lock lock = new ReentrantLock();
  ]]></description><category></category></item><item><title><![CDATA[银行家算法]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/107435453</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/107435453</guid><author>SunStaday</author><pubDate>Sat, 18 Jul 2020 21:44:38 +0800</pubDate><description><![CDATA[银行家算法安全序列原理代码实现
安全序列原理

需要分配的资源（MAX）
已经分配的资源（Allocation）
还需要分配的资源（Need）
可分配的资源（Available）
线程（T）
只有当全部线程都满足分配，才是安全序列；
如图：可分配的资源（2，3，3）
T4还需资源（2，2，1），（2，2，1）&lt;（2，3，3）进行分配，T4满足后，可分配资源=T4已经分配的资源+上一次可分配的资源=（2，0，4）+（2，3，3）=（4，3，7）；
同理，T5还需资源（1，1，0），进行分配，可分配资源=]]></description><category></category></item><item><title><![CDATA[死锁详解]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/107434314</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/107434314</guid><author>SunStaday</author><pubDate>Sat, 18 Jul 2020 21:04:45 +0800</pubDate><description><![CDATA[死锁什么是死锁死锁的必要条件常见死锁1）交叉锁2）内存不足3）一问一答的数据交换4）死循环引起的死锁如何避免死锁死锁的预防死锁的避免解决哲学家就餐的死锁问题
什么是死锁
死锁是指两个或两个以上的线程在执行过程中，由于竞争资源或者由于彼此通信而造成的一种阻塞的现象，若无外力作用，它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁，这些永远在互相等待的进程称为死锁进程。
死锁的必要条件

1）互斥条件：某个资源某一时刻只能由一个线程占用
2）不可抢占条件：资源申请者不能从资源占有者手中抢夺资源
3）占]]></description><category></category></item><item><title><![CDATA[synchronized详解]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/107347322</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/107347322</guid><author>SunStaday</author><pubDate>Tue, 14 Jul 2020 22:07:26 +0800</pubDate><description><![CDATA[synchronized详解synchronized关键字synchronized理解Java中对象头monitorsynchronized用法同步方法的底层原理同步代码块的底层原理单例模式synchronized锁升级分析偏向锁轻量级锁重量级锁
synchronized关键字

防止线程干扰和内存一致性错误，如果一个对象对多个线程是可见的，那么对该对象的所有读/写都可以通过同步的方式来进行
Synchronized关键字提供了锁机制，能够去保证共享资源的互斥访问，解决数据不一致的问题

synchroni]]></description><category></category></item><item><title><![CDATA[Volatile详解]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/107304742</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/107304742</guid><author>SunStaday</author><pubDate>Sun, 12 Jul 2020 22:12:11 +0800</pubDate><description><![CDATA[文章目录内存模型概念程序计数器虚拟机栈/本地方法栈堆方法区并发编程的三大特性原子性可见性可序性缓存一致性问题解决方法Java内存模型Volatile 内存屏障Volatile关键字原理及实现机制Volatile可见性Volatile 不可保证原子性Volatile 可序性使用场景及作用
内存模型概念
内存模型描述了程序中各个变量（实例域、静态域和数组元素）之间的关系，以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节，对象最终是存储在内存里面的，但是编译器、运行库、处理器或者系统缓存可以]]></description><category></category></item><item><title><![CDATA[多线程详解]]></title><link>https://blog.youkuaiyun.com/SunStaday/article/details/107129118</link><guid>https://blog.youkuaiyun.com/SunStaday/article/details/107129118</guid><author>SunStaday</author><pubDate>Sat, 04 Jul 2020 20:02:30 +0800</pubDate><description><![CDATA[@[TOC] 多线程
并发与并行
并发
并发：多个线程操作同一个资源，不是同时执行，而是交替执行，单核CPU交替执行时间间隔特别短，
并行
并行：并行指的是同时执行，多核CPU,每一个线程使用一个单独CPU，
并发编程
并发编程：指多个任务在一个时间段重复执行的结构
并发编程的三特性
并发编程的三个特性：
1.原子性
原子操作：不可分割的操作，中间不会被其他线程打断，不需要同步操作
多个原子操作合起来就需要使用到同步
原子性指的是一次操作或者多个操作，要么全部执行，要么全部都不执行
例如：
int a = ]]></description><category></category></item></channel></rss>