<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[mxy_111的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/mxy_111</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; mxy_111]]></copyright><item><title><![CDATA[Java内存模型和Volatile关键字]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125380791</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125380791</guid><author>mxy_111</author><pubDate>Mon, 20 Jun 2022 21:12:00 +0800</pubDate><description><![CDATA[一、什么是Java内存模型  Java内存模型(Java Memory Model，简称JMM)。在了解Java内存模型之前我们要先知道计算机的内存机制，现在大多数计算机都是多核CPU，每个CPU上都可以执行线程，而线程使用的数据都是储存在内存中，所以我们就需要从内存中去读取数据，但是这个过程对计算机来说是一个很慢很慢的的过程，而CPU处理指令的速度却是很快的，所以为了解决这两者之间速度的问题，就引入了高速缓存的概念，高速缓存分为L1、L2、L3多级，详细的看下图。其中越靠近CPU的结构读取速度就越快，但是]]></description><category></category></item><item><title><![CDATA[源码角度了解Skywalking之Skywalking是如何进行JVM监控的]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125380770</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125380770</guid><author>mxy_111</author><pubDate>Mon, 20 Jun 2022 21:10:14 +0800</pubDate><description><![CDATA[大家都知道Skywalking可以监控Java的JVM情况，包括垃圾回收情况等等，那么它是怎么实现的呢？今天就带大家一探究竟。通过前几篇的文章我们知道，Skywalking启动的时候，会加载各种BootService实现类，而有关JVM的BootService实现类就是JVMServiceJVMService可以看做一个定时器，它收集JVM cpu、内存、内存池和gc 信息等等参数，并将收集到的信息通过GRPCChannelManager提供的通道发送给Collector，GRPCChannelManage]]></description><category></category></item><item><title><![CDATA[基于机器学习和深度学习，华为大神手写AIoT系统学习小册]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125380710</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125380710</guid><author>mxy_111</author><pubDate>Mon, 20 Jun 2022 21:07:21 +0800</pubDate><description><![CDATA[学习完本小册后你可以在简历上写：应用不同的人工智能技术，包括机器学习和基于TensorFlow和Keras的深度学习。访问和处理来自各种分布式数据源的数据。对AIoT数据执行有监督和无监督机器学习。基于MLlib和H2O.ai平台，在Apache Spark框架上实现对IoT数据的分布式处理。基于深度学习方法对时间序列数据进行预测。从可穿戴设备和智能设备得到的数据中获取独到的洞察。小册目录​ 
 
​ 
​ 
​ 
​ 
部分内容截图大多数数据库都是采用关系型数据库的组织方式。一个关系型数据库由一个或多个相]]></description><category></category></item><item><title><![CDATA[双管齐下，JDK源码+HotSpot源码一次性学完]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125380665</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125380665</guid><author>mxy_111</author><pubDate>Mon, 20 Jun 2022 21:05:21 +0800</pubDate><description><![CDATA[JDK源码手册除了第一章节的内容外，我们会从第二章开始自下而上，从简单到复杂的有顺序的深度学习整个Concurrent包！​ 
 
Semaphore（Semaphore也就是信号量，提供了资源数量的并发访问控制）​ 
​ 
HotSpot源码手册 这份手册主要讲述的就是HotSpot基础功能模块的源码，这份手册对于你基础地基将会是一个很好的补充，同时手册将会结合大量的实例进行讲解，这样对于受众来说将会更加容易接受以及吸收。​ 
 
 
​ 
HandleArea、Area与Chunk​ 
klassVta]]></description><category></category></item><item><title><![CDATA[短期内跳槽的Java程序员必看的八项知识点+两大项目实战]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125380582</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125380582</guid><author>mxy_111</author><pubDate>Mon, 20 Jun 2022 21:01:17 +0800</pubDate><description><![CDATA[1：多线程高并发2：JVM虚拟机3：设计模式4：redis5: zookeeper6: mysql调优课程7：netty（网游后端项目）8：spring源码分析2大项目:网约车+亿级流量多级缓存架构平台一、多线程与高并发基础概念JUC同步工具同步容器线程池高频面试加分项JMH = Java Microbenchmark Harness应用类型Disruptor​二、JVM虚拟机JVM调优案例式实战化指导见1:虚拟机基础概念2: class文件结构3:内存加载过程4:运行时内存结构5: JVM常用指令6: G]]></description><category></category></item><item><title><![CDATA[Javac 源码调试教程]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125346713</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125346713</guid><author>mxy_111</author><pubDate>Sat, 18 Jun 2022 14:25:40 +0800</pubDate><description><![CDATA[一直有读者问我 javac 源码怎么调试，自己也在写 JVM 掘金小册的过程中阅读了大量的 javac 的源码，网上这方面的文章也比较少，那就来写一篇 javac 源码调试的文章吧，作为 javac 系列文章的开篇。javac 源码调试的过程是比较简单的，它本身就是一个用 Java 语言写的，对我们理解内部逻辑比较友好。环境备注：Intellij、JDK81、第一步下载导入 javac 的源码如果不想从 openjdk 下载折腾，可以跳过第 1 步直接从我的 github 下载：github.com/art]]></description><category></category></item><item><title><![CDATA[更多发作品811收藏分享引人入胜，实战讲解“Java性能调优六大工具”之linux命令行工具]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125346650</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125346650</guid><author>mxy_111</author><pubDate>Sat, 18 Jun 2022 14:21:38 +0800</pubDate><description><![CDATA[Linux平台是使用最为广泛的服务器平台之一，不少Java端程序都运行在类Linux平台（如AIX、Solaris等）上。不同的类Linux操作系统的很多命令都非常相似，不少命令仅有一些细节上的差异。本节主要介绍用于Linux平台的性能收集和统计工具。top命令的输出结果可以分为两个部分： 前半部分是系统统计信
息， 后半部分是进程信息。
在统计信息中， 第1行是任务队列信息， 它的结果等同于uptime命
令。 从左到右依次表示： 系统当前时间、 系统运行时间、 当前登录用户
数及系统的平均负载（使用lo]]></description><category></category></item><item><title><![CDATA[【无标题】]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125339213</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125339213</guid><author>mxy_111</author><pubDate>Fri, 17 Jun 2022 19:36:20 +0800</pubDate><description><![CDATA[FutureTask用法介绍FutureTask是JDK并发包为Future接口提供的一个实现，代表一个支持取消操作（cancel）的异步计算任务。它实现了Future接口和Runnable接口，所以既是计算任务对象也是结果对象。它可以提交到线程池中去执行，并且结果直接放在自身这个FutureTask中，不是放在另外一个Future中。我们把FutureTask提交到线程池运行的方法一般是先实现一个Callable或Runnable，然后再把它传给FutureTask的对应构造函数从而创建一个FutureT]]></description><category></category></item><item><title><![CDATA[Java并发工具AbstractQueuedSynchronizer实现详解]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125339145</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125339145</guid><author>mxy_111</author><pubDate>Fri, 17 Jun 2022 19:33:52 +0800</pubDate><description><![CDATA[AbstractQueuedSynchronizer（以下简称AQS或AQS锁）是ReentrantLock的底层实现，它提供了自旋、FIFO线程等待队列和阻塞等功能。Java常见并发同步工具如Semaphore、CountDownLatch、ReentrantLock等都是基于AQS实现的。AQS的实现要点总结如下：1. 用一个原子int变量代表同步状态AQS内部有一个原子int变量（命名为state），它是AQS的核心状态，也是唯一跟同步有关的变量。例如，ReentrantLock中state≠0表示锁]]></description><category></category></item><item><title><![CDATA[【无标题】Java线程池ThreadPoolExecutor的实现原理详解，让面试官仰望]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125339132</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125339132</guid><author>mxy_111</author><pubDate>Fri, 17 Jun 2022 19:28:08 +0800</pubDate><description><![CDATA[本文将分析Java线程池ThreadPoolExecutor的实现原理，掌握了实现原理能帮助你更好的优化程序的性能，避免很多错误用法。本文的代码量较少，主要讲原理，等你把原理完全弄明白了代码随便一写一大堆。1. 线程池的状态首先，线程池是一个有状态的对象。状态有以下几种：· RUNNING: 运行中。此时线程池能接受任务，并且会处理队列中的任务；· SHUTDOWN: 关闭中。此时，线程池不接受新任务，但是会处理队列中的任务；· STOP: 停止。此时线程池不接受新任务，也不会处理队列中的任务，还会中断wo]]></description><category></category></item><item><title><![CDATA[公司是一个线程池，员工在池子里工作，看来真理无论到哪都通用啊]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125339117</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125339117</guid><author>mxy_111</author><pubDate>Fri, 17 Jun 2022 19:27:11 +0800</pubDate><description><![CDATA[之前我们严肃而认真的研究了Java线程池(ThreadPoolExecutor类)的用法，还深入解析了实现原理，当时我们的学习姿态是这样的。不知道身为程序员的你有没有认真阅读前面的文章。如果你认真学习的话，那么一定会知道Java线程池管理线程的方法：当线程数小于corePoolSize的时候，来一个任务就创建一个线程；当线程数大于corePoolSize然而阻塞队列有容纳空间的时候，任务放进队列；当线程数大于corePoolSize并且队列也满了后，再次创建线程，直到线程数达到maximumPoolSize]]></description><category></category></item><item><title><![CDATA[下一次面试就会问——Java并发工具Semaphore的用法及实现原理]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125339091</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125339091</guid><author>mxy_111</author><pubDate>Fri, 17 Jun 2022 19:25:47 +0800</pubDate><description><![CDATA[Semaphore这个英文单词的意思是信号灯，即发送信号的那种灯。Java并发工具包中的Semaphore类则是线程之间互相发送信号的工具。我们可以把Semaphore看作一个包含多个许可（permit）的集合，例如一个代表5个许可的Semaphore、6个许可的Semaphore等等（为便于表达，后文用字母P表示许可）。Semaphore上的acuqire操作申请P，而release操作则产生P，Semaphore可用于追踪可用资源的个数。1. 在代码中的某个地方创建Semaphore(第2个构造参数是公]]></description><category></category></item><item><title><![CDATA[redis 数据类型，string底层结构，穿透，击穿，雪崩，数据一致性]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125314423</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125314423</guid><author>mxy_111</author><pubDate>Thu, 16 Jun 2022 13:36:51 +0800</pubDate><description><![CDATA[一，redis的数据类型 string Hash List Set zset，string的存储结构是什么？String：数据结构是简单动态字符串（simple dynamic string），简称sds；sds的结构如下： "nihao" 单词最终是这样存储的 free记录的是当前可用的空间，len记录的当前数据的长度，buf记录的是当前的数据，它是一个字符数据结构，因为是用C写的所以后面有"\0"。这种结构的优点：防止数据溢出：假如不是这种sds结构存储，redis是用C写的，所以我们每次存储数据的时候]]></description><category></category></item><item><title><![CDATA[java中==和equals的区别，重写equals时要重写hashcode]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125314395</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125314395</guid><author>mxy_111</author><pubDate>Thu, 16 Jun 2022 13:34:56 +0800</pubDate><description><![CDATA[先写一个Student类后面会用到


==和equals是要分情况的==分两种情况：



	如果作用于引用类型的变量，则比较的是所指向的对象的地址,比如我们又Student类





equals也分两种情况：比如我们又Student类 ,这个和==号比较对象或者引用类型是一样的效果





重写equals需要重写hashcode上面的例子我们也看到了用equals去比较Student返回的false,因为它比较的是内存地址。如果我们想比较的话就需要在Student类里面重写equals方法和ha]]></description><category></category></item><item><title><![CDATA[MySQL数据库外键导致死锁]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125314379</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125314379</guid><author>mxy_111</author><pubDate>Thu, 16 Jun 2022 13:33:47 +0800</pubDate><description><![CDATA[问题是，针对同一张表的两条数据事务1先开启执行step-1, 对id=1这条数据加排他锁（X锁），事务2开启 执行step-2,对id=2这条纪录加排他锁（X锁）事务1执行step-3，此时事务2已经持有id=2的排他锁，所以step-3处于等待状态事务2 执行step-4，发现事务1已经持有id=1的锁，导致互相等待报死锁 B表为主表，A表持有B表主键，存在外键关联的情况，如果数据发生变化：增删改情况，mysql都会默认的先去主表查询数据并且增加共享锁，防止当前修改的数据发生出现死锁的过程：事务1执行st]]></description><category></category></item><item><title><![CDATA[HashMap 初始容量设置为9，真的就是9吗]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125314360</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125314360</guid><author>mxy_111</author><pubDate>Thu, 16 Jun 2022 13:32:16 +0800</pubDate><description><![CDATA[HashMap 初始容量设置为9，真的就是9吗？答案是否定的。我们一般不需要设置HashMap的容量，默认容量16，负载因子为0.75，也就是说内容超过16*0.75=12，就会进行rehash扩容，但是扩容这个过程是比较费时间的。所以如果我们预估的内容超过12（不是16）的时候，我们最好指定下长度。那这个长度如何计算呢？遵循公式： (int) ((float) expectedSize / 0.75F + 1.0F)，比如我们要放20个元素，那就是 20/0.75+1=27，这里的加1，是因为20/0.7]]></description><category></category></item><item><title><![CDATA[spring配置正确，但是事务还是失效？]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125314309</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125314309</guid><author>mxy_111</author><pubDate>Thu, 16 Jun 2022 13:27:47 +0800</pubDate><description><![CDATA[最近有同学给我说他的spring配置是正确的，但是发现有的事务生效，有的事务不生效，我第一直觉就是他的写法可能有问题。后来我总结一些事务不生效的场景。spring事务分两种，一种注解事务，另一种编程式事务。我们一般使用注解事务@Transactional。注解实现原理是基于AOP，而AOP基于代理拦截做的，另外事务的传递是利用ThreadLocal，所以必须满足三个条件事务才能生效：


我用代码说明下：1，被调用的方法不能在同一个类中：因为事务注解基于代理实现，如果调用方法和被调用的方法在同一个类中，是平]]></description><category></category></item><item><title><![CDATA[一文就懂Java虚拟机的CMS收集器原理及使用]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125305721</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125305721</guid><author>mxy_111</author><pubDate>Wed, 15 Jun 2022 22:10:51 +0800</pubDate><description><![CDATA[CMS收集器的设计目标是优先降低GC停顿时间（相对地降低吞吐量），并且适合于有足够CPU资源提供给GC线程使用的那些应用程序。所以，如果你需要较短的GC停顿时间并且CPU数量充足，那么建议使用CMS收集器。例如，如果应用程序有较多长期存活的对象，那么老年代就会很大，导致GC暂停时间很长，并且有至少2个以上cpu核，那么适合使用CMS收集器。
-XX:+UseConcMarkSweepGC


CMS收集器针对新生代和老年代分别独立回收（新生代minor gc，老年代major gc）。因为新生代空间较小，老]]></description><category></category></item><item><title><![CDATA[Semaphore的概念及基本用法]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125305683</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125305683</guid><author>mxy_111</author><pubDate>Wed, 15 Jun 2022 22:08:45 +0800</pubDate><description><![CDATA[Semaphore这个英文单词的意思是信号灯，即发送信号的那种灯。Java并发工具包中的Semaphore类则是线程之间互相发送信号的工具。我们可以把Semaphore看作一个包含多个许可（permit）的集合，例如一个代表5个许可的Semaphore、6个许可的Semaphore等等（为便于表达，后文用字母P表示许可）。Semaphore上的acuqire操作申请P，而release操作则产生P，Semaphore可用于追踪可用资源的个数。  1. 在代码中的某个地方创建Semaphore(第2个构造参数]]></description><category></category></item><item><title><![CDATA[基于JDK 7，我们如何实现一个多线程计数器？]]></title><link>https://blog.youkuaiyun.com/mxy_111/article/details/125305631</link><guid>https://blog.youkuaiyun.com/mxy_111/article/details/125305631</guid><author>mxy_111</author><pubDate>Wed, 15 Jun 2022 22:05:02 +0800</pubDate><description><![CDATA[基于JDK 7，我们如何实现一个多线程计数器？一般做法是定义一个volatile long或定义一个AtomicLong（底层也是volatile long），然后在每个线程中用CAS操作对它进行add操作。这两种做法都是没问题的，功能是正确的、性能也还好，我们继续按照原来的方式使用即可。不过，如果你的项目升级到了JDK 8，还可以进一步提高多线程计数器的性能，让它比传统的volatile long方式更高效。JDK 8新增的LongAdder类（父类是Striped64，包含一些公用方法）就是用来完成这个]]></description><category></category></item></channel></rss>