<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[g_gstudy的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/g_gstudy</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; g_gstudy]]></copyright><item><title><![CDATA[MySql的间隙锁和不可重复读]]></title><link>https://blog.youkuaiyun.com/g_gstudy/article/details/123300675</link><guid>https://blog.youkuaiyun.com/g_gstudy/article/details/123300675</guid><author>g_gstudy</author><pubDate>Sat, 05 Mar 2022 21:14:37 +0800</pubDate><description><![CDATA[SQL标准中DB隔离级别有：

read uncommitted：可以读到其它transaction 未提交数据
read committed：可以读到其它transaction 已提交数据
repeatable read：一个transaction中相同的查询，每次获取的结果是一样的
serialize：所有操作串行

脏读 即一个transaction 可以读到另一个的未提交数据。

不可重复读 即一个transaction 中，两次相同的查询会读到不一样的结果。

幻读 一个transaction中，]]></description><category></category></item><item><title><![CDATA[currenthashmap线程安全的原因]]></title><link>https://blog.youkuaiyun.com/g_gstudy/article/details/123300049</link><guid>https://blog.youkuaiyun.com/g_gstudy/article/details/123300049</guid><author>g_gstudy</author><pubDate>Sat, 05 Mar 2022 20:19:41 +0800</pubDate><description><![CDATA[1 线程安全的hash表初始化

由上文可知ConcurrentHashMap是用table这个成员变量来持有hash表的。

table的初始化采用了延迟初始化策略，他会在第一次执行put的时候初始化table。

可通过sizeCtl保证线程安全。

成员变量sizeCtl在ConcurrentHashMap中的其中一个作用相当于HashMap中的threshold，当hash表中元素个数超过sizeCtl时，触发扩容； 他的另一个作用类似于一个标识，例如，当他等于-1的时候，说明已经有某一线程...]]></description><category></category></item><item><title><![CDATA[hashmap线程不安全的原因]]></title><link>https://blog.youkuaiyun.com/g_gstudy/article/details/123298578</link><guid>https://blog.youkuaiyun.com/g_gstudy/article/details/123298578</guid><author>g_gstudy</author><pubDate>Sat, 05 Mar 2022 18:23:29 +0800</pubDate><description><![CDATA[1 扩容时可能造成死循环，扩容时会造成死锁，形成环形链表；或者造成扩容大小不一致等问题
2 多个线程put的时，get的值可能不一致，put的操作不是原子性的
3 删除键值对的时候，会删除刚刚修改的位置元素

扩容操作时：
这个操作会新生成一个新的容量的数组，然后对原数组的所有键值对重新进行计算和写入新的数组，之后指向新生成的数组。
当多个线程同时检测到总数量超过门限值的时候就会同时调用resize操作，各自生成新的数组并rehash后赋给该map底层的数组table，结果最终只有最后一个线程生成的新数组被]]></description><category></category></item><item><title><![CDATA[死锁的优化]]></title><link>https://blog.youkuaiyun.com/g_gstudy/article/details/123298431</link><guid>https://blog.youkuaiyun.com/g_gstudy/article/details/123298431</guid><author>g_gstudy</author><pubDate>Sat, 05 Mar 2022 17:58:15 +0800</pubDate><description><![CDATA[死锁的四个必要条件：请求和保持、互斥、不可剥夺、循环等待。



-死锁条件-----破除方法--

请求和保持 ： 预先分配

互斥：虚拟资源

不可剥夺：可剥夺，死锁检测之后就中止最后导致死锁的进程

循环等待：按序申请资源



1. 正确的顺序获得锁

如果必须获取多个锁，我们就要考虑不同线程获取锁的顺序。

上面的例子出现死锁的根本原因就是获取所的顺序是乱序的，超乎我们控制的。上面例子最理想的情况就是把业务逻辑抽离出来，把获取锁的代码放在一个公共的方法里面，让这两个线程获取锁都是从我的公共的方法里]]></description><category></category></item><item><title><![CDATA[事务注解失效]]></title><link>https://blog.youkuaiyun.com/g_gstudy/article/details/123298051</link><guid>https://blog.youkuaiyun.com/g_gstudy/article/details/123298051</guid><author>g_gstudy</author><pubDate>Sat, 05 Mar 2022 17:38:08 +0800</pubDate><description><![CDATA[事务注解 @Transactional 失效的3种场景及解决办法_HollisChuang's Blog-优快云博客

@Transactional

第一种Transactional注解标注方法修饰符为非public时，@Transactional注解将会不起作用。例如以下代码，定义一个错误的@Transactional标注实现，修饰一个默认访问符的方法

@Transactional注解标注方法修饰符为非public时，@Transactional注解将会不起作用。这里分析 的原因是，@Transa.]]></description><category></category></item><item><title><![CDATA[IOC和AOP]]></title><link>https://blog.youkuaiyun.com/g_gstudy/article/details/123293244</link><guid>https://blog.youkuaiyun.com/g_gstudy/article/details/123293244</guid><author>g_gstudy</author><pubDate>Sat, 05 Mar 2022 17:21:55 +0800</pubDate><description><![CDATA[IOC

ioc是一种设计思想，指的是将程序中原本有我们手动创建对象的控制权，在使用spring后，将这个控制权交给spring容器进行控制管理，由spring来管理对象的生命周期和对象的依赖关系。

ioc由专门的容器来创建对象，将所有的类都方法哦spring容器中，当我们需要某个对象的时候，不在需要自己主动去new了只需要告诉spring容器，然后spring容器就会把对应的对象返还给你。

传统的应用程序都是由我们在类内部主动创建依赖对象，从而导致类的耦合度高，有个springioc之后把创建和查找依]]></description><category></category></item><item><title><![CDATA[判断类是否相等以及类加载器]]></title><link>https://blog.youkuaiyun.com/g_gstudy/article/details/123291207</link><guid>https://blog.youkuaiyun.com/g_gstudy/article/details/123291207</guid><author>g_gstudy</author><pubDate>Sat, 05 Mar 2022 11:30:54 +0800</pubDate><description><![CDATA[两个类是否相等取决于是否由统一的类加载器加载，如果他们来自不同的类加载器，哪怕这两个类来自同一个class文件他们也不相等。

类加载流程



加载：类加载过程的一个阶段：通过一个类的完全限定查找此类字节码文件，并利用字节码文件创建一个Class对象

验证：目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求，不会危害虚拟机自身安全。主要包括四种验证，文件格式验证，元数据验证，字节码验证，符号引用验证。

准备：为类变量(即static修饰的字段变量)分配内存并且设置该类变量的初始值即0(如s]]></description><category></category></item><item><title><![CDATA[多态理解及实现原理]]></title><link>https://blog.youkuaiyun.com/g_gstudy/article/details/123290044</link><guid>https://blog.youkuaiyun.com/g_gstudy/article/details/123290044</guid><author>g_gstudy</author><pubDate>Sat, 05 Mar 2022 10:38:23 +0800</pubDate><description><![CDATA[面试中学习]]></description><category></category></item><item><title><![CDATA[狂神说SQL总结]]></title><link>https://blog.youkuaiyun.com/g_gstudy/article/details/117534770</link><guid>https://blog.youkuaiyun.com/g_gstudy/article/details/117534770</guid><author>g_gstudy</author><pubDate>Thu, 03 Jun 2021 21:11:48 +0800</pubDate><description><![CDATA[MySQL



01 https://blog.youkuaiyun.com/qq_33369905/article/details/105828923?spm=1001.2014.3001.5501

02 https://blog.youkuaiyun.com/qq_33369905/article/details/105828926?spm=1001.2014.3001.5501

03 https://blog.youkuaiyun.com/qq_33369905/article/details/105852675?spm=1...]]></description><category></category></item></channel></rss>