<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[binga的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/pang5356</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; pang5356]]></copyright><item><title><![CDATA[线程池原理剖析]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/109601624</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/109601624</guid><author>pang5356</author><pubDate>Tue, 10 Nov 2020 17:06:44 +0800</pubDate><description><![CDATA[目录为什么需要线程池线程池的模型线程池相关属性和状态线程池的拒绝策略ScheduledThreadPoolExecutor-调度线程池
为什么需要线程池
在web开发中，服务器需要接受并处理请求，所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便，但是存在一个问题：
如果并发的请求数量非常多，但每个线程执行的时间很短，这样就会频繁的创建和销毁线程，如此一来会大大降低系统的效率。可能出现服务器在为每个请求创建新线程和销毁线程上花费的时间和消耗的系统资源要比处理实际的用户]]></description><category></category></item><item><title><![CDATA[FutureTask源码剖析]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/109600023</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/109600023</guid><author>pang5356</author><pubDate>Tue, 10 Nov 2020 15:45:09 +0800</pubDate><description><![CDATA[目录Future和FutureTaskFuture的方法FutureTask的源码总结
Future和FutureTask
我们通过FutureTask的实现追踪如下：


Runable接口：提供线程回调方法run()方法。
Future: 定义返回结果的相关操作抽象方法。

RunableFuture接口: 整合Runable和Future两个接口的抽象方法。


Future的方法


取消当前线程执行的任务。
boolean cancel(boolean mayInterruptIfRunning)]]></description><category></category></item><item><title><![CDATA[PriorityBlockingQueue和DelayQueue队列剖析]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/109557208</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/109557208</guid><author>pang5356</author><pubDate>Sun, 08 Nov 2020 12:01:59 +0800</pubDate><description><![CDATA[目录PriorityBlockingQueue优先级阻塞队列DelayQueue延迟队列
在阻塞队列BlockingQueue数组和链表的实现中剖析了基于数组和链表的实现的阻塞队列，接下来来剖析一下与优先级相关的阻塞队列PriorityBlockingQueue和DelayQueue。在介绍之前需要了解优先级队列相关的知识，以下是优先级队列的相关知识链接：
源码阅读(12)：Java中主要的Queue、Deque结构——PriorityQueue集合（上）
源码阅读(13)：Java中主要的Queue、De]]></description><category></category></item><item><title><![CDATA[阻塞队列BlockingQueue数组和链表的实现]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/109516688</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/109516688</guid><author>pang5356</author><pubDate>Thu, 05 Nov 2020 18:25:05 +0800</pubDate><description><![CDATA[目录阻塞队列抽象接口BlockingQueue数组阻塞队列ArrayBlockingQueue链表阻塞队列LinkedBlockingQueue
在并发多线程之Lock及ReentrantLock源码剖析中了解了独占锁的实现ReentrantLock及Condition的原理和使用，接下来就来了解一下基于ReentrantLock和Condition实现的阻塞队列，本篇主要讲解的是数组和链表实现阻塞队列。首先队列的特性大家都知道是“先进先出”，那么实现先进先出的队列数据结构可以使用数组或者链表，链表一般能都]]></description><category></category></item><item><title><![CDATA[CountDownLatch源码剖析]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/109463201</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/109463201</guid><author>pang5356</author><pubDate>Tue, 03 Nov 2020 14:33:22 +0800</pubDate><description><![CDATA[目录AQS中共享锁的实现AQS中共享锁相关的方法CountDownLatch原理浅析CountDownLatch源码剖析
在并发多线程之AQS源码分析（上）和并发多线程之AQS源码分析（下）中分析了AQS的独占锁下的方法。当然AQS也提供了共享锁的实现。接下来就先简单分析一下AQS中关于共享锁的实现原理流程及AQS源码，然后再剖析一下基于AQS实现的共享锁CountDownLatch。
AQS中共享锁的实现
在AQS对线程的调用阻塞时通过同步队列实现的，将阻塞的线程添加至同步队列中，当满足条件时则从队列中唤]]></description><category></category></item><item><title><![CDATA[并发多线程之Lock及ReentrantLock源码剖析]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/109401063</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/109401063</guid><author>pang5356</author><pubDate>Sat, 31 Oct 2020 13:54:28 +0800</pubDate><description><![CDATA[目录Lock及ReentrantLock提供的功能Lock接口提供的方法ReentrantLock的实现
在并发多线程之AQS源码分析（上）和并发多线程之AQS源码分析（下）已经对JUC中的AQS源码进行了剖析梳理，AQS可以说是juc包下所有工具的基础框架，其提供了两种队列：同步队列和条件队列。并且控制了资源的获取和释放，以及线程的阻塞和唤醒调度。那么接下来就是学习一下juc包下各个工具是怎么基于AQS来实现的，这里先从Lock及其实现类ReentrantLock开始。关于Lock及ReentrantLo]]></description><category></category></item><item><title><![CDATA[并发多线程之AQS源码分析（下）]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/109386902</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/109386902</guid><author>pang5356</author><pubDate>Fri, 30 Oct 2020 18:04:01 +0800</pubDate><description><![CDATA[目录AQS实现线程通信原理相关类源码分析
在上一篇并发多线程之AQS源码分析（上）中介绍了关于独占锁相关的方法，本篇来介绍AQS实现线程间通信Condition及ConditionObject等相关的源码分析。当然在梳理之前我们先把原理搞懂可以起到事半功倍的效果。
AQS实现线程通信原理
关于条件队列
在AQS中线程间通信是通过引入条件队列来实现，条件队列在前面已经介绍，条件队列是一个单向的链表结构。如下：

AQS通过引入条件队列，在线程不满足运行条件时，将线程添加至条件队列中并阻塞，当其他线程通过唤醒方]]></description><category></category></item><item><title><![CDATA[并发多线程之AQS源码分析（上）]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/109359670</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/109359670</guid><author>pang5356</author><pubDate>Thu, 29 Oct 2020 16:06:11 +0800</pubDate><description><![CDATA[目录AQS的实现原理AQS的队列实现NodeAQS的核心属性和方法
在JUC原理一篇了解了JUC的都是围绕着AbstractQueuedSynchronizer（简称AQS）实现的，也就是说AbstractQueuedSynchronizer为JUC的核心，本篇就是探索AbstractQueuedSynchronizer的源码。
AQS的实现原理
在开始阅读源码之前再来梳理一下JUC的原理，那么在阅读源码时可以提高效率。
AQS的两个队列
在AQS中存在两个队列用于对线程的状态保存和记录，分别是同步队列和条]]></description><category></category></item><item><title><![CDATA[并发多线程之JUC原理]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/109272244</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/109272244</guid><author>pang5356</author><pubDate>Sun, 25 Oct 2020 12:47:13 +0800</pubDate><description><![CDATA[目录AQS主要属性及主要方法
在了解了java内置锁(synchronized)之后，我们来了解下自1.5之后java在java.util.concurrent包中提供的并发工具类，大多数同步器实现都是围绕着共同的基础行为，比如等待队列、条件队列、独占获取、共享获取等，而这个行为的抽象就是基于AbstractQueuedSynchronizer简称AQS，AQS定义了一
套多线程访问共享资源的同步器框架，是一个依赖状态(state)的同步器。
AQS具有以下特性：

阻塞等待队列
共享/独占
公平/非公平
]]></description><category></category></item><item><title><![CDATA[并发多线程之sychronized]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/109270776</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/109270776</guid><author>pang5356</author><pubDate>Sun, 25 Oct 2020 11:21:17 +0800</pubDate><description><![CDATA[目录对象内存布局synchronized底层原理Jvm内置锁的优化偏向锁和轻量级锁的应用场景锁的膨胀升级过程
设计同步器的意义 ：
多线程编程中，有可能会出现多个线程同时访问同一个共享、可变资源的情况，
这个资源我们称之其为临界资源；这种资源可能是：对象、变量、文件等。

共享：资源可以由多个线程同时访问。
可变：资源可以在其生命周期内被修改。

引出的问题：
由于线程执行的过程是不可控的，所以需要采用同步机制来协同对对象可变状
态的访问那么我们怎么解决线程并发安全问题？
实际上，所有的并发模式在解决线程安]]></description><category></category></item><item><title><![CDATA[并发编程之volatile关键字]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/109260533</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/109260533</guid><author>pang5356</author><pubDate>Sat, 24 Oct 2020 15:52:08 +0800</pubDate><description><![CDATA[目录volatile的内存语义volatile的可见性volatile的禁止重排优化总线风暴引入synchronized
volatile的内存语义
volatile是Java虚拟机提供的轻量级的同步机制。volatile关键字有如下两个作用 保证被volatile修饰的共享变量对所有线程总数可见的，也就是当一个线程修改了一 个被volatile修饰共享变量的值，新值总是可以被其他线程立即得知。
禁止指令重排序优化。
volatile的可见性
在JMM的介绍时已经提到，volatile是通过缓刑一致性协议实]]></description><category></category></item><item><title><![CDATA[Java的内存模型JMM]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/109259451</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/109259451</guid><author>pang5356</author><pubDate>Sat, 24 Oct 2020 15:38:18 +0800</pubDate><description><![CDATA[标题什么是JMM内存模型JMM内存模型定义的8种操作JMM的原子性JMM的可见性JMM的有序性总结
什么是JMM内存模型
Java内存模型描述的是一组规则，通过这组规则控制程序中各个变量在共享数据区域和私有数据区域的访问方式，通过这组规范定义了程序中各个变量（包括实例字段，静态字段和构成数组对象的元素）的访问方式。从而脱离于操作系统的硬件模型，可以看到JMM内存模型与计算机的硬件有很多相似之处；
计算机模型：

JMM内存模型：

通过制定这个规则，每个JVM实现都遵循这一规则，从而可以使java实现“一次]]></description><category></category></item><item><title><![CDATA[并发多线程之线程]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/109231591</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/109231591</guid><author>pang5356</author><pubDate>Thu, 22 Oct 2020 22:39:59 +0800</pubDate><description><![CDATA[目录用户线程和内核线程Java使用的线程JVM中线程的创建new java.lang.Thread().start()使用JNI将一个native thread attach到JVM中Java中实现线程的方式线程的生命周期线程上下文切换及死锁线程上下文切换死锁
什么是线程？
现代操作系统在运行一个程序时，会为其创建一个进程。例如，启动一个Java程序，操作系统就会创建一个Java进程。现代操作系统调度CPU的最小单元是线程，也叫轻量级进程（Light Weight Process），在一个进程里可以创建多个]]></description><category></category></item><item><title><![CDATA[缓存一致性协议：MESI]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/109227588</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/109227588</guid><author>pang5356</author><pubDate>Thu, 22 Oct 2020 18:41:47 +0800</pubDate><description><![CDATA[目录缓存一致性问题缓存一致性协议四种状态缓存一致性协议(MESI)流程缓存一致性协议失效总线风暴问题
缓存一致性问题
在多处理器系统中，每个处理器都有自己的高速缓存，而它们又共享同一主内存 （MainMemory）。基于高速缓存的存储交互很好地解决了处理器与内存的速度矛盾，但是 也引入了新的问题：缓存一致性（CacheCoherence）。当多个处理器的运算任务都涉及同一 块主内存区域时，将可能导致各自的缓存数据不一致的情况，如果真的发生这种情况，那同步回到主内存时以谁的缓存数据为准呢？为了解决一致性的问题]]></description><category></category></item><item><title><![CDATA[volatile禁止重排序的原理-内存屏障]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/109226307</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/109226307</guid><author>pang5356</author><pubDate>Thu, 22 Oct 2020 17:30:25 +0800</pubDate><description><![CDATA[目录JMM中volitile内存语义的实现volitile写的内存屏障volitile读的内存屏障内存屏障的优化内存屏障手动添加
程序中，为了更高效的执行，会对代码或者指令进行重排序，在java中程序运行过程中可能会发生以下情况的重排序：

编译器优化重排序；
指令级并行重排序；
内存系统重排序；

为了实现volatile内存语义，JMM会分别限制这两种类型的重排序类型。 下图是JMM针对编译器制定的volatile重排序规则表。

举例来说:

第三行最后一个单元格的意思是：在程序中，当第一个操作为普通]]></description><category></category></item><item><title><![CDATA[Mysql优化六：Mysql的锁和事务隔离级别]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/108992394</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/108992394</guid><author>pang5356</author><pubDate>Sat, 10 Oct 2020 11:02:39 +0800</pubDate><description><![CDATA[目录Mysql中的锁锁定义锁分类表锁表锁之读锁表锁之写锁表锁总结行锁行锁支持的事务事务隔离级别行锁展示读未提交读已提交可重复读串行化间隙锁解决幻读无索引行锁会升级为表锁行锁分析死锁优化建议
Mysql中的锁
锁定义
锁是计算机协调多个进程或线程并发访问某一资源的机制。
在数据库中，除了传统的计算资源（如CPU、RAM、I/O等）的争用以外，数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题，锁冲突也是影响数据库并发访问性能的一个重要因素。
锁分类

从性能上]]></description><category></category></item><item><title><![CDATA[Mysql优化五：trace工具使用及排序、分组和分页查询优化]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/108977454</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/108977454</guid><author>pang5356</author><pubDate>Fri, 09 Oct 2020 14:40:20 +0800</pubDate><description><![CDATA[目录trace工具的使用排序和分组优化demo1demo2demo3demo4demo5demo6demo7demo8排序优化总结文件排序（filesort）原理详解文件排序方式分类文件排序方式的选择文件排序方式示例分页查询优化根据自增且连续的主键排序的分页查询根据非主键字段排序的分页查询
trace工具的使用
Mysql如何合适的选择素引呢？接下来我们来看一个示例。
EXPLAIN SELECT * FROM employees WHERE name &gt; 'a';


从上述的直接结果可以知道，在查]]></description><category></category></item><item><title><![CDATA[Mysql优化四：关联、count、in及exist优化]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/108881199</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/108881199</guid><author>pang5356</author><pubDate>Wed, 30 Sep 2020 10:59:52 +0800</pubDate><description><![CDATA[目录join关联查询优化Nested-Loop Join 算法基于块的嵌套循环连接 Block Nested-Loop Join(BNL)算法关联查询总结in和exist优化count的优化
join关联查询优化
接下来通过实例来了解一下join关联查询的运行原理及优化的思路。首先来看一下两个示例表的结构：
t1表的结构如下：
DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a]]></description><category></category></item><item><title><![CDATA[Mysql优化三：索引的使用规则和注意事项]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/108823970</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/108823970</guid><author>pang5356</author><pubDate>Sun, 27 Sep 2020 11:15:49 +0800</pubDate><description><![CDATA[条目全值匹配最左前缀法则不在索引列上做任何操作（计算、函数、（自动or手动）类型转换），会导致索引失效而转向全表扫描存储引擎不能使用索引中范围条件右边的列尽量使用覆盖索引（只访问索引的查询（索引列包含查询列）），减少select *语句mysql在使用不等于（！=或者&lt;&gt;）的时候无法使用索引会导致全表扫描is null,is not null 也无法使用索引like以通配符开头（'$abc...'）mysql索引失效会变成全表扫描操作字符串不加单引号索引失效少用or或in，用它查询时，非主键字段]]></description><category></category></item><item><title><![CDATA[Mysql优化二：Explain工具列介绍]]></title><link>https://blog.youkuaiyun.com/pang5356/article/details/108777051</link><guid>https://blog.youkuaiyun.com/pang5356/article/details/108777051</guid><author>pang5356</author><pubDate>Thu, 24 Sep 2020 16:59:43 +0800</pubDate><description><![CDATA[目录id列select_type列table列type列possible_keys列key列key_len列ref列rows列Extra列
使用EXPLAIN关键字可以模拟优化器执行SQL语句，分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字，MySQL 会在查询上设置一个标记，执行查询会返 回执行计划的信息，而不是执行这条SQL 。
注意：如果 from 中包含子查询，仍会执行该子查询，将结果放入临时表中。
在查询中的每个表会输出一行，如果有两个表通过 join ]]></description><category></category></item></channel></rss>