<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[qq_19450921的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/qq_19450921</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_19450921]]></copyright><item><title><![CDATA[Springboot生命周期和自动装配]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/162907988</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/162907988</guid><author>qq_19450921</author><pubDate>Wed, 15 Jul 2026 15:47:57 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[双指针相关算法]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/158923078</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/158923078</guid><author>qq_19450921</author><pubDate>Wed, 11 Mar 2026 13:49:38 +0800</pubDate><description><![CDATA[给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。slow指针走过的是已经处理好的元素。fast走过的是判断过的元素。]]></description><category></category></item><item><title><![CDATA[redis及实现分布式锁的原理]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/157977230</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/157977230</guid><author>qq_19450921</author><pubDate>Wed, 11 Feb 2026 17:16:26 +0800</pubDate><description><![CDATA[redisson分布式锁原理。]]></description><category></category></item><item><title><![CDATA[jvm重点图示]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/157726986</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/157726986</guid><author>qq_19450921</author><pubDate>Wed, 04 Feb 2026 14:12:53 +0800</pubDate><description><![CDATA[2.类加载3.运行时内存程序计数器虚拟机栈堆方法区new一个对象。]]></description><category></category></item><item><title><![CDATA[condition实现阻塞队列]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/157397863</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/157397863</guid><author>qq_19450921</author><pubDate>Mon, 26 Jan 2026 17:07:02 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[ConcurrentHashHap]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/157389548</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/157389548</guid><author>qq_19450921</author><pubDate>Mon, 26 Jan 2026 11:02:59 +0800</pubDate><description><![CDATA[‌但基于 put 的复合业务逻辑可能不是线程安全的‌，需要开发者额外使用同步机制（如 synchronized 块）或 ConcurrentHashMap 提供的原子方法（如 computeIfAbsent、merge 等）来保证。ConcurrentHashMap.put() 方法本身是线程安全的‌，不会破坏内部数据结构。]]></description><category></category></item><item><title><![CDATA[类锁和对象锁]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/157389486</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/157389486</guid><author>qq_19450921</author><pubDate>Mon, 26 Jan 2026 11:01:38 +0800</pubDate><description><![CDATA[那么不能用对象锁，加在整个类上粒度又太大了，一个用户的任务会影响其他用户也被锁住。这样一个对象获取到，另一个就获取不到了，因为就一个是共享的锁。再去用不同的实例去调用时，是对当前对象加锁，test1拿到锁之后，test2也能拿到，是不同实例的锁，所以锁的只是当前调用的对象。test1调用方法获得锁，test2再调用的时候获取不到了，因为锁在了这个类上，那么整个这个类的实例在调用的时候都调用不了。对象锁是基于对堆内存内对象的头部加锁信息；如果是用私有的lock也是一样的，要是对整个类上锁就加static，]]></description><category></category></item><item><title><![CDATA[hashmap]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/157386902</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/157386902</guid><author>qq_19450921</author><pubDate>Mon, 26 Jan 2026 10:23:07 +0800</pubDate><description><![CDATA[初始容量，table 数组大小是由 capacity 这个参数确定的，默认是16，也可以构造方法时传入，最大限制是1<<30；向上最接近2的幂值。右移16位 分为高半区低半区做异或，加大低位的随机性，也掺杂高位的部分特征。如果映射到同一个位置时，发生冲突，尾插法形成链表，大小超过8个会。当size大于threshold会resize为2倍。转为红黑树，为了查询效率，节点小于6时再转为链表。用散列值对长度取模，作为下标，用位运算效率高。这样把key,value映射到表中一个位置。hash扰动函数来降低冲突。]]></description><category></category></item><item><title><![CDATA[线程安全：原子性指令重排可见性]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/157250944</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/157250944</guid><author>qq_19450921</author><pubDate>Thu, 22 Jan 2026 11:53:05 +0800</pubDate><description><![CDATA[没刷到主内存的时候，别的线程拿到的都是不对的，有点像脏读啊, 那就不一致了呗，不对了呗。2.线程2拿到i=0,执行i++；得到i=1，赋值给主内存，其实可能还没给到主内存。1.线程1拿到i=0  没有执行i++的时候，线程2抢着执行。就是这个操作不是一个整体，执行的过程中被别的线程打断了。可见性：主内存就是内存，工作内存就是线程自己的缓存。得到i=1，赋值给主内存。volatile就是禁止指令重排，和保证可见性的。4.2次本来结果为2，但是因为并发导致是1。例子就是多个线程执行i++, 最后得到的结果。]]></description><category></category></item><item><title><![CDATA[java锁升级]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/157249857</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/157249857</guid><author>qq_19450921</author><pubDate>Thu, 22 Jan 2026 11:00:51 +0800</pubDate><description><![CDATA[偏向锁就是之前获取过的就还给你，就认为是所谓的锁上了，就是有访问权了。轻量就是去修改一个字段的值，如果成功了就相当于获取到访问权了，这里应该是硬件的cas作修改看能不能改成功，然后并不是真正阻塞了。这些都是默认说没人来争抢，那我就不用加重锁，如果这时又线程来竞争，那就不行了，就得再升级。因为加锁会导致线程切换，系统从用户态转到内核态，影响性能。所以先尝试偏向锁 轻量锁 自旋  然后才加重锁.锁是在字节码里通过获取monitor实现的。首先乐观锁不是真的锁。]]></description><category></category></item><item><title><![CDATA[Spring的AOP失效场景]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/157219690</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/157219690</guid><author>qq_19450921</author><pubDate>Wed, 21 Jan 2026 17:56:20 +0800</pubDate><description><![CDATA[3. 异常类型不匹配 抛出checked exception 不rollback for Exception class。cglib 类和接口 创建其子类的方式 都不支持final的  性能好 但是创建花的时间多。4. requires_new传播机制时，外层的回滚不回影响本来的事务，被挂起的。5.@Async异步方法AOP拦截器无法跟踪到这些新线程中的方法调用。2.非事务方法调用事务方法 内部调用绕过了代理对象。动态生成代理类的字节码，运行时反射创建字节码文件。不侵入原有的逻辑 并且代码逻辑可复用。]]></description><category></category></item><item><title><![CDATA[[二分查找]]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/126843493</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/126843493</guid><author>qq_19450921</author><pubDate>Tue, 13 Sep 2022 22:57:37 +0800</pubDate><description><![CDATA[。。]]></description><category></category></item><item><title><![CDATA[【刷题】滑动窗口]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/125233778</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/125233778</guid><author>qq_19450921</author><pubDate>Sat, 11 Jun 2022 14:01:56 +0800</pubDate><description><![CDATA[。。。]]></description><category></category></item><item><title><![CDATA[AutocompleteSystem]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/119619703</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/119619703</guid><author>qq_19450921</author><pubDate>Wed, 11 Aug 2021 23:21:37 +0800</pubDate><description><![CDATA[Note:
MANY DETAILS ARE MISSED:


If less than 3, return as many as it. So it could be NPE when queue.poll().getKey()


Use alphabetical order if times are same. So in the queu need to compare value first then compare string.


Logically it needs to set chi]]></description><category></category></item><item><title><![CDATA[2021-06-20微软面试]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/118068425</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/118068425</guid><author>qq_19450921</author><pubDate>Sun, 20 Jun 2021 12:36:02 +0800</pubDate><description><![CDATA[package msinterview;
public class CoinTransition {
static int count = 0;
public static void main(String[] args) {
int[] coins = new int[] {1, 1, -1};
	System.out.print(maxTransition(coins));
}

// 1是正面 -1是花
static int maxTransition(int[] coins) {
	
	for (i]]></description><category></category></item><item><title><![CDATA[【刷题】leetcode 355. Design Twitter]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/108963670</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/108963670</guid><author>qq_19450921</author><pubDate>Thu, 08 Oct 2020 20:43:42 +0800</pubDate><description><![CDATA[public class Twitter {
    Map&lt;Integer, Set&lt;Integer&gt;&gt; fans = new HashMap&lt;&gt;();
    Map&lt;Integer, LinkedList&lt;Tweet&gt;&gt; tweets = new HashMap&lt;&gt;();
    int cnt = 0;

    public void postTweet(int userId, int tweetId) {
        i]]></description><category></category></item><item><title><![CDATA[【刷题】leetcode 113 path sum II]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/108963589</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/108963589</guid><author>qq_19450921</author><pubDate>Thu, 08 Oct 2020 15:12:53 +0800</pubDate><description><![CDATA[Example:
Given the below binary tree and sum = 22,
  5
 / \
4   8

/   / 
11  13  4
/  \    / 
7    2  5   1
Return:
[
[5,4,11,2],
[5,8,4,5]
]
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *    ]]></description><category></category></item><item><title><![CDATA[【刷题】leetcode 621 task schedule]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/108963504</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/108963504</guid><author>qq_19450921</author><pubDate>Thu, 08 Oct 2020 15:07:51 +0800</pubDate><description><![CDATA[Given a characters array tasks, representing the tasks a CPU needs to do, where each letter represents a different task. Tasks could be done in any order. Each task is done in one unit of time. For each unit of time, the CPU could complete either one task ]]></description><category></category></item><item><title><![CDATA[【刷题】leetcode 763 partition labels]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/108963414</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/108963414</guid><author>qq_19450921</author><pubDate>Thu, 08 Oct 2020 15:02:44 +0800</pubDate><description><![CDATA[A string S of lowercase English letters is given. We want to partition this string into as many parts as possible so that each letter appears in at most one part, and return a list of integers representing the size of these parts.
Example 1:
Input: S = “ab]]></description><category></category></item><item><title><![CDATA[【刷题】Leetcode 394 decode string]]></title><link>https://blog.youkuaiyun.com/qq_19450921/article/details/108963244</link><guid>https://blog.youkuaiyun.com/qq_19450921/article/details/108963244</guid><author>qq_19450921</author><pubDate>Thu, 08 Oct 2020 14:59:04 +0800</pubDate><description><![CDATA[用栈
public class Solution {
    public String decodeString(String s) {
        String res = "";
        Stack&lt;Integer&gt; countStack = new Stack&lt;&gt;();
        Stack&lt;String&gt; resStack = new Stack&lt;&gt;();
        int idx = 0;
        while (id]]></description><category></category></item></channel></rss>