<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[java_FF的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/java_FF</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; java_FF]]></copyright><item><title><![CDATA[Activiti学习心得]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/121786991</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/121786991</guid><author>java_FF</author><pubDate>Wed, 08 Dec 2021 15:30:43 +0800</pubDate><description><![CDATA[Activiti is the leading lightweight, java-centric open-source BPMN engine supporting real-world process automation needs.
翻译：Activiti是领先的轻量级、以 Java 为中心的开源 BPMN 引擎。

]]></description><category></category></item><item><title><![CDATA[Activiti7]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/121760730</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/121760730</guid><author>java_FF</author><pubDate>Tue, 07 Dec 2021 16:58:31 +0800</pubDate><description><![CDATA[Activiti7
概念
使用步骤

部署activiti：引入activiti，把业务系统和activiti集成到一起。
定义流程：建模工具定义业务流程.bpmn文件。
部署流程：保存业务流程。activici是通过数据库将流程持久化的。
启动流程实例：开始一次业务流程。
用户查询待办任务：所有业务流程都交由activiti管理，使用activiti提供的api方法可以查询当前流程执行到哪一步了。
用户处理待办任务：用户处理完待办任务后，activiti会自动推进工作流。
流程结束：待办任务处理完成，且没]]></description><category></category></item><item><title><![CDATA[java web项目部署在linux系统出现第一次登录高延迟的问题]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/121132365</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/121132365</guid><author>java_FF</author><pubDate>Wed, 03 Nov 2021 22:32:10 +0800</pubDate><description><![CDATA[今天记录一下之前遇到的问题：项目部署在window登录能很快完成，部署到linux后，第一次登录过程变得很慢。
通过查看系统日志，发现时间主要消耗在了创建session，并且定位到是SecureRandom的初始化问题，继续查看，发现session的id创建方式为uuid，到这里，熟悉linux的人就会明白问题在哪了。
Java的UUID依赖于SecureRandom.nextBytes方法，而SecureRandom又依赖于操作系统提供的随机数源。在Linux系统下，它的默认依赖是/dev/random，]]></description><category></category></item><item><title><![CDATA[并发线程池]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115767748</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115767748</guid><author>java_FF</author><pubDate>Fri, 16 Apr 2021 17:28:39 +0800</pubDate><description><![CDATA[并发线程池常用线程池执行器JDK四个内置线程池线程池参数拒绝策略
常用线程池执行器
JDK自带线程池执行器（ThreadPoolExecutor）
spring封装的线程池执行器（ThreadPoolTaskExecutor）
后者其实是对前者的一个封装
JDK四个内置线程池
如下，不过实际一般使用自定义的线程池，视服务器情况而定。

newFixedThreadPool：创建一个定长线程池，超出的任务会在队列中等待。
newCachedThreadPool：创建一个可缓存线程池，空闲了可以回收，少了可以创]]></description><category></category></item><item><title><![CDATA[踩坑记录]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115753104</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115753104</guid><author>java_FF</author><pubDate>Fri, 16 Apr 2021 11:53:21 +0800</pubDate><description><![CDATA[springboot使用踩坑记录自定义shiro过滤器被spring抢占导致无限拦截原因解决
自定义shiro过滤器被spring抢占导致无限拦截
自定义shiro过滤器时，不能使用@Bean自动注入，使用@Bean就交给spring管理了，而我们本意是将过滤器交给shiro管理。
	/**
     * 自定义过滤器不要使用@Bean自动注入，应该手动调用方法创建logoutCustomFilter()。
     * 使用自动注入就交给spring管理了，而我们本意是交给shiro管理
     * @]]></description><category></category></item><item><title><![CDATA[堆内存变量的使用和volatile关键字]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115748799</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115748799</guid><author>java_FF</author><pubDate>Fri, 16 Apr 2021 09:43:18 +0800</pubDate><description><![CDATA[工作线程使用对象时通过对象引用地址找到堆内存中的变量后，并不是直接操作堆内存中的对象，而是拷贝一份到自己的私有内存中，完成操作后再把值写回到堆内存。volatile关键字可以让工作线程每次使用对象时都去堆内存获取最新的值（每一步的原子操作都去堆内存操作），但是注意效率会降低。


...]]></description><category></category></item><item><title><![CDATA[Shiro安全框架口述理解]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115723915</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115723915</guid><author>java_FF</author><pubDate>Thu, 15 Apr 2021 15:22:47 +0800</pubDate><description><![CDATA[Shiro安全框架shiro核心组件subjectSecurityManagerRealm认证和授权流程认证授权内置过滤器
shiro核心组件
subject
包含了身份和凭证两个信息
SecurityManager
安全管理器，shiro所有操作都在安全管理器的保护之下
Realm
可以理解为是shiro的数据源，主要用于获取认证凭证和权限信息。可以配置多个Realm。
认证和授权流程
认证
登录请求过来后，调用主题（subject）中的login方法，然后到安全管理器（SecurityManager）调]]></description><category></category></item><item><title><![CDATA[JDK1.8新特性]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115701998</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115701998</guid><author>java_FF</author><pubDate>Wed, 14 Apr 2021 17:19:01 +0800</pubDate><description><![CDATA[JDK1.8新特性Stream 流式运算Lambda表达式函数式接口方法引用日期时间 API
Stream 流式运算
Stream流式思想可以理解为车间的生产线，Stream不是一种数据结构，不会保存数据，而是对数据进行加工处理。不会改变数据源。中间方法是懒加载，如果没有结束方法是不会执行中间方法的。Stream是一次性操作，当结束方法执行完成后，代表加工完成了，Stream就无法再进行其他操作了。**parallelStream（并行流）**也就是有多条生产线的车间，他的效率比Stream（串行流）高，但]]></description><category></category></item><item><title><![CDATA[数据库事务四大特征]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115626562</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115626562</guid><author>java_FF</author><pubDate>Mon, 12 Apr 2021 16:08:20 +0800</pubDate><description><![CDATA[数据库事务四大特征原子性（Atomicity）一致性（Consistency）隔离性（Isolation）持久性（Durability）
原子性（Atomicity）
原子性是指事务包含的所有操作要么全部成功，要么全部失败回滚，因此事务的操作如果成功就必须要完全应用到数据库，如果操作失败则不能对数据库有任何影响。
一致性（Consistency）
假设用户A和用户B两者的钱加起来一共是5000，那么不管A和B之间如何转账，转几次账，事务结束后两个用户的钱相加起来应该还得是5000，这就是事务的一致性。
隔离]]></description><category></category></item><item><title><![CDATA[SpringCloud组件]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115626041</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115626041</guid><author>java_FF</author><pubDate>Mon, 12 Apr 2021 15:58:19 +0800</pubDate><description><![CDATA[SpringCloud组件EurekaRibbonFeignHystrixZuul
Eureka
各个服务启动时，Eureka Client都会将服务注册到Eureka Server，并且Eureka Client还可以反过来从Eureka Server拉取注册表，从而知道其他服务在哪里
Ribbon
服务间发起请求的时候，基于Ribbon做负载均衡，从一个服务的多台机器中选择一台
Feign
基于Feign的动态代理机制，根据注解和选择的机器，拼接请求URL地址，发起请求
Hystrix
发起请求是通过H]]></description><category></category></item><item><title><![CDATA[TCP概述]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115620467</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115620467</guid><author>java_FF</author><pubDate>Mon, 12 Apr 2021 15:44:28 +0800</pubDate><description><![CDATA[HTTP、TCPHTTPTCP三次握手第一次第二次第三次：为什么需要三次半连接队列和全连接队列SYN攻击（洪泛攻击）四次挥手第一次第二次第三次第四次为什么需要四次
HTTP
HTTP又名超文本传输协议，采用了请求/响应模型。一个HTTP请求报文由请求行、请求头部、空行和请求数据4个部分组成。响应由三个部分组成，分别是：状态行、消息报头、响应正文。HTTP的连接很简单，是无状态的；而HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议，要比HTTP协议安全。
TCP
TCP是一种面向]]></description><category></category></item><item><title><![CDATA[GC垃圾回收]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115545247</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115545247</guid><author>java_FF</author><pubDate>Fri, 09 Apr 2021 16:28:57 +0800</pubDate><description><![CDATA[GC垃圾回收垃圾判断引用计数算法可达性分析算法垃圾回收标记清除算法复制算法标记整理算法分代收集算法
垃圾判断
引用计数算法
给对象加一个引用计数器，有一个地方引用时就+1，引用释放就-1，为0时代表可回收。但是因为无法解决循环引用问题，java虚拟机并没有采用这种方式。
可达性分析算法
通过GC Root对象作为起点，根据对象引用关系，向下搜索，所走过的路径称为引用链，当一个对象到GC Root没有任何引用链相连，证明对象是可回收的。
可作为GC Root的对象：

虚拟机栈(栈帧中的本地变量表)中引用的对]]></description><category></category></item><item><title><![CDATA[JVM内存模型]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115549950</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115549950</guid><author>java_FF</author><pubDate>Fri, 09 Apr 2021 14:56:23 +0800</pubDate><description><![CDATA[程序计数器
每个线程私有，记录程序执行到哪一步。通过这个计数器的值来选取下一条需要执行的字节码指令。因为所存的只是下一条指令的地址，就算死循环也不会让内存溢出，所以不存在OutOfMemoryError（内存溢出） 异常。
虚拟机栈
每个线程私有，每个 Java 方法执行的时候都会创建一个方法栈帧，并从虚拟机栈的顶部入栈（压栈），执行完成后从虚拟机栈出栈（弹栈）。会抛出 StackOverflowError（堆栈溢出，线程请求的栈深度大于虚拟机所允许的深度） 和 OutOfMemoryError（内存溢出.]]></description><category></category></item><item><title><![CDATA[数据库索引]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115526635</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115526635</guid><author>java_FF</author><pubDate>Thu, 08 Apr 2021 17:35:39 +0800</pubDate><description><![CDATA[数据库索引
索引就相当于目录，它们包含着对数据表里所有记录的引用指针。优点：可以大大加快数据的检索速度。缺点：时间方面：创建索引和维护索引要耗费时间，具体地，当对表中的数据进行增加、删除和修改的时候，索引也要动态的维护，会降低增/改/删的执行效率；空间方面：索引需要占物理空间。
SQL查询优化

索引优化，通过添加索引提高检索速度
SQL语句优化

Explain 用来分析 SELECT 查询语句，开发人员可以通过分析结果来优化查询语句。
只返回必要的列：最好不要使用 SELECT * 语句。
只返回必要的]]></description><category></category></item><item><title><![CDATA[数据库三范式]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115526562</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115526562</guid><author>java_FF</author><pubDate>Thu, 08 Apr 2021 17:26:40 +0800</pubDate><description><![CDATA[开发中应严格遵循数据库三范式
第一范式：每个列都不可以再拆分。
第二范式：在第一范式的基础上，非主键列完全依赖于主键，而不能是依赖于主键的一部分。
第三范式：在第二范式的基础上，非主键列只依赖于主键，不依赖于其他非主键。

...]]></description><category></category></item><item><title><![CDATA[分布式锁]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115521147</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115521147</guid><author>java_FF</author><pubDate>Thu, 08 Apr 2021 15:36:24 +0800</pubDate><description><![CDATA[锁的条件以及错误场景

互斥性：在任意时刻，只有一个客户端能持有锁。也就是说加锁的过程要保证原子性。
不会发生死锁：如果一个客户端在拿到锁后执行业务代码时崩溃，就可能会发生死锁。可以给锁加上过期时间，但是依然要满足原子性。
解铃还须系铃人：一个客户端在拿到锁后执行业务代码时间超过了锁的过期时间，但是没有出现业务异常，其他线程去竞争锁的时候发现锁过期了，就把锁删除了。务必保证加锁和解锁是同一个客户端，客户端自己不能把别人加的锁给解了。redisson有一个看门狗可以给锁续期，相当于一个保护线程。


...]]></description><category></category></item><item><title><![CDATA[Redis为什么这么快]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115519549</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115519549</guid><author>java_FF</author><pubDate>Thu, 08 Apr 2021 14:40:24 +0800</pubDate><description><![CDATA[redis为什么这么快

Redis 将数据储存在内存里面，读写数据的时候都不会受到硬盘 I/O 速度的限制，所以速度极快。
I/O多路复用模型
由于采用I/O多路复用，所以单线程得以实现，因而不存在多线程切换的消耗，也不存在加锁和释放锁的性能消耗。

I/O多路复用
“多路”指的是多个网络连接，“复用”指的是复用同一个线程。采用I/O多路复用技术可以让单个线程高效的处理多个连接请求，尽量减少网络 IO 的时间消耗。

...]]></description><category></category></item><item><title><![CDATA[缓存雪崩，缓存击穿，缓存穿透]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115514742</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115514742</guid><author>java_FF</author><pubDate>Thu, 08 Apr 2021 12:03:52 +0800</pubDate><description><![CDATA[缓存雪崩
同一时间缓存大面积过期，所有原本应该访问缓存的请求都去查询数据库了。
解决方法：

加锁，若缓存中没有，则所有进程去竞争锁，若抢到锁，则去查数据库并添加缓存；没有抢到锁的其他线程休眠一段时间后再去缓存中取，没有取到则继续竞争锁。
将缓存失效时间分散开来，避免大面积过期。

缓存击穿
某个热点缓存过期，同一时刻大量请求直接去查询数据库，数据库压力增大。
解决方法：

加锁，若缓存中没有，则所有进程去竞争锁，若抢到锁，则去查数据库并添加缓存；没有抢到锁的其他线程休眠一段时间后再去缓存中取，没有取到则继]]></description><category></category></item><item><title><![CDATA[Redis数据类型]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115514680</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115514680</guid><author>java_FF</author><pubDate>Thu, 08 Apr 2021 11:56:26 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[Redis持久化]]></title><link>https://blog.youkuaiyun.com/java_FF/article/details/115513411</link><guid>https://blog.youkuaiyun.com/java_FF/article/details/115513411</guid><author>java_FF</author><pubDate>Thu, 08 Apr 2021 11:52:19 +0800</pubDate><description><![CDATA[RDB
是Redis默认的持久化方式。按照配置周期性的把内存的数据以快照的形式保存到硬盘的二进制文件中，直接拿文件内容重建。不会占用太大的磁盘空间，性能较好，但是无法保证数据一致性，只能将数据恢复到上次保存快照的时候。
AOF
Redis会将每一个收到的写命令都以追加的方式添加到一个日志文件中。当Redis宕机重构时会按顺序执行日志文件中的命令来重构整个数据库。无法保证数据完全一致性，但可以大幅提高数据一致性，但是追加的命令日志会越来越大，并且重构起来效率较低。
实际应用RDB+AOF
实际应用中，可以隔一]]></description><category></category></item></channel></rss>