<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[技术不值钱]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/cow4j</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; cow4j]]></copyright><item><title><![CDATA[JVM-类加载]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119967134</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119967134</guid><author>cow4j</author><pubDate>Sat, 28 Aug 2021 13:40:16 +0800</pubDate><description><![CDATA[我们面试的时候，经常会被问到类加载机制，要想把这个问题很好的回答，需要对类加载体系非常熟悉，希望看了这里的介绍，会对大家有一定的帮助。同样还是建议大家先阅读下《Java字节码解读》，再来看类加载。
我们先用一张图来描述下类的整个生命同期：
加载
加载是类加载过程的第一步，这个加载过程主要就是靠类加载器实现的，包括用户自定义的类加载器。


加载过程

我们都知道类由类加载器加载，在加载的过程中JVM主要做3件事情：


通过一个类的全限定名来获取定义此类的二进制字节流（class文件）
在程序运行过程中，当]]></description><category></category></item><item><title><![CDATA[JVM-JIT]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119897828</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119897828</guid><author>cow4j</author><pubDate>Tue, 24 Aug 2021 20:16:29 +0800</pubDate><description><![CDATA[JDK、JRE与JVM的关系
我们一直学习怎么使用Java，像我工作了好几年，也不知道这三者的关系，不知道也没关系，把自己不知道的让自己变成知道那就是进步，不要对自己有太高的期望，大家都是平常人。
下图很好的解释了这三者之间的关系：JDK包含了编译器等开发工具和JRE，而JRE包含了运行类库和JVM。那JVM又是个啥？

JVM和Java的关系
讲道理Java是一门语言，跟JVM关系不大，我们的Java代码经过编译后成为class文件，JVM加载的就是这些class文件，JVM并不是只能加载由Java编译的]]></description><category></category></item><item><title><![CDATA[Centos安装Redis]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119834361</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119834361</guid><author>cow4j</author><pubDate>Sat, 21 Aug 2021 01:25:34 +0800</pubDate><description><![CDATA[1）下载源码
https://download.redis.io/releases/
从上面的地址中选择要下载的版本
[root@redis01 tools]# wget https://download.redis.io/releases/redis-6.2.4.tar.gz
--2021-06-28 14:46:05--  https://download.redis.io/releases/redis-6.2.4.tar.gz
Resolving download.redis.io (download]]></description><category></category></item><item><title><![CDATA[动态代理实现原理]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119795455</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119795455</guid><author>cow4j</author><pubDate>Thu, 19 Aug 2021 10:07:16 +0800</pubDate><description><![CDATA[动态代理由来
Java程序员应该都知道，静态代理就是使用一个代理类(Proxy)来完成想要完成的事情，Proxy类通过编译器编译成class文件，当系统运行时，此class已经存在。这种静态的代理模式在增强现有的接口业务功能方面有很大的优点，但是大量使用静态代理，会使系统内的类大规模爆发，不易维护。
为了解决这个问题，就有了动态创建Proxy的想法，在运行状态中，动态的创建一个Proxy代理类，使用完之后就会销毁，这样就不用维护大量的代理类。
静态代理案例
创建一个车票接口，定义一个卖票的方法。
packa]]></description><category></category></item><item><title><![CDATA[DNS、CDN知识]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119777180</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119777180</guid><author>cow4j</author><pubDate>Wed, 18 Aug 2021 11:53:47 +0800</pubDate><description><![CDATA[DNS
在了解DNS之前，我们先来了解下域名。我们在访问网站的时候，都是通过域名来进行访问的，那么域名是怎么找到我们访问的网站的呢？
其实域名是被一个叫做ICANN的组织进行管理的，我们常见的域名结尾部分，如.com、.cn、.net、.org…等。类似这种就叫做顶级域名，由于顶级域名非常的多，ICANN不好管理这么多的顶级域名，于是每个顶级域名都找一个托管商，让托管商来管理。而ICANN则管理这些托管商，ICANN也被称为根域名节点。
所有域名查询都要先查询根域名，只有根域名才知道这些顶级域名都是由谁在管]]></description><category></category></item><item><title><![CDATA[HTTP、HTTPS总结]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119759700</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119759700</guid><author>cow4j</author><pubDate>Tue, 17 Aug 2021 16:22:43 +0800</pubDate><description><![CDATA[HTTP(Hyper Text Transfer Protocol)名叫超文本传输协议。
早期HTTP只有GET请求，用来简单的拿文件，拿完就断开了连接。
HTTP1.0时期，在单一GET方式中增加了POST、HEAD命令、引入了请求头和响应头、增加了HTTP版本号、增加了响应状态码、引入Content-Type使传输不限于文本。但是该版本还是存在一些问题：

连接无法复用，HTTP1.0规定浏览器与服务器只保持短暂的连接，浏览器的每次请求都需要与服务器建立一个TCP连接。
发送一次请求时，需要等待服务端响]]></description><category></category></item><item><title><![CDATA[OSI模型和TCP三次握手四次挥手]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119735619</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119735619</guid><author>cow4j</author><pubDate>Mon, 16 Aug 2021 16:12:25 +0800</pubDate><description><![CDATA[我们通过电脑进行上网，需要借助网线、光纤、路由器等设备，我们先来简单了解下这几种设备是怎么传送网络信号的，在计算机系统中，只能够识别0或1的二进制数据。


网线
普通的网线由四组铜导线组成，一共8根。通过在网线的两端加上电压，然后改变电压的值，这样就可以使用低压表示0，高压来表示1，以此来传递0、1电信号。



光纤
光纤中含有玻璃纤维，可以对光进行折射，从而可以将光从一端传送到另一端。通过控制光的打开和关闭来表示0或1，以此来传递光信号。



无线设备
我们常见的无线路由器，通过改变电压从而产生变化]]></description><category></category></item><item><title><![CDATA[Centos安装Mysql的三种方式]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119713434</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119713434</guid><author>cow4j</author><pubDate>Sun, 15 Aug 2021 14:28:41 +0800</pubDate><description><![CDATA[以下都是在Centos7环境下安装Mysql5.7，环境不同可能会不出一些不一样的问题，所以大家尽量使用和本文一样的环境，Centos7环境可以参考VM安装Centos7的文档。
一、yum安装
https://repo.mysql.com/中找到自己要下载的版本，这里以5.7为例
[root@mysql01 tools]# wget https://repo.mysql.com/mysql57-community-release-el7.rpm

1）安装mysql源
[root@mysql01 tool]]></description><category></category></item><item><title><![CDATA[VMware安装Centos7.9及基本配置]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119677185</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119677185</guid><author>cow4j</author><pubDate>Fri, 13 Aug 2021 15:45:53 +0800</pubDate><description><![CDATA[下载Centos操作系统，地址：https://www.centos.org/download/


















启动虚拟机

















网卡配置
[root@mother-board ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
#修改BOOTPROTO="static",最后添加下面的IP配置，具体IP根据自己的IP段进行配置。
IPADDR=192.168.31.100
GATEWAY=192.168.31]]></description><category></category></item><item><title><![CDATA[volatile原理]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119652077</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119652077</guid><author>cow4j</author><pubDate>Thu, 12 Aug 2021 19:38:01 +0800</pubDate><description><![CDATA[volatile
我们都知道volatile可以解决线程间变量可见性问题。可见性的意思是当一个线程修改一个共享变量时，另外一个线程能读到这个修改的值。
使用hsdis工具打印出汇编指令，可以发现，加了volatile修饰之后打印出来的汇编指令多了下面一行：

lock是一种控制指令，在多处理器环境下，lock汇编指令可以基于总线锁或者缓存锁的机制来达到可见性的效果。
CPU处理器
在了解volatile之前，我们需要先了解下线程的相关知识。
线程是CPU调度的最小单元，线程设计的目的是为了更充分的发挥CPU]]></description><category></category></item><item><title><![CDATA[ReentrantLock源码解析]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119616008</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119616008</guid><author>cow4j</author><pubDate>Wed, 11 Aug 2021 20:17:07 +0800</pubDate><description><![CDATA[Java除了使用关键字synchronized，还可以用ReentrantLock实现独占锁的功能。ReentrantLock相比synchronized而言功能更加丰富，使用起来更为灵活，更多区别还需要大家自己去理解，只有充分了解了ReentrantLock和synchronized才会明白两者的区别所在，这里就不一一说明有哪些区别了，每个人的理解都不一样，死记硬背的逻辑不可靠。
ReentrantLock分为公平锁和非公平锁，用法如下：
package com.doaredo.test;

import]]></description><category></category></item><item><title><![CDATA[浮点类型精度问题]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119581591</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119581591</guid><author>cow4j</author><pubDate>Tue, 10 Aug 2021 23:10:25 +0800</pubDate><description><![CDATA[在Java中，浮点类型有float、double两种类型，主要用于表示小数。我们经常看到浮点数有精度问题，不适用于比较大小或比较相等的逻辑。任何数字在计算机中都是用0和1的二进制形式来表示的，那么对于浮点数又是如何使用0和1表示出来的呢？

浮点数二进制计算方法

对于整数的二进制计算，采用“除2取余，逆序排列”来算出二进制，如下所示：

对于小数的二进制计算，采用“乘2取整，顺序排列”来算出二进制，如下所示：


浮点数二进制转10进制

要使用二进制表示浮点数，就是要让小数部分也能使用二进制来表示。二进]]></description><category></category></item><item><title><![CDATA[ThreadLocal源码分析]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119581545</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119581545</guid><author>cow4j</author><pubDate>Tue, 10 Aug 2021 23:07:48 +0800</pubDate><description><![CDATA[ThreadLocal称为线程本地变量，可以让每个线程拥有一个属于自己的变量的副本，主要作用就是做数据隔离，在多线程环境下，每个线程可以拥有自己的变量数据，不被其他线程可见。
使用场景

Spring事务隔离级别

在Spring事务环节讲解

参数传递

在项目中经常会有一个线程调用多个方法的情况，方法间需要传递对象，比如用户信息、业务信息等。如果给每个方法都增加参数会比较麻烦，像第三方的库，对象参数就传递不过去了。我们可以使用ThreadLocal在调用前把参数set进来，其它需要的地方get下就可以了]]></description><category></category></item><item><title><![CDATA[CAS原理]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119578661</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119578661</guid><author>cow4j</author><pubDate>Tue, 10 Aug 2021 20:35:45 +0800</pubDate><description><![CDATA[CAS即Compare And Swap，我们称为比较再交换。
在Java中，并发情况下，我们可以使用synchronized来实现锁。在jdk1.5之前，synchronized为悲观锁，后面由于ReentrantLock的无锁操作，synchronized也进行了改版，性能反而比ReentrantLock的好一点，但核心原理和ReentrantLock相关无几，其中都有使用CAS算法。
CAS是用在多线程环境下，要真正理解CAS，我们还需要了解一点关于CPU的知识：线程是CPU调度的最小单元，线程设计的]]></description><category></category></item><item><title><![CDATA[HashMap(jdk1.8)源码思想]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119534178</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119534178</guid><author>cow4j</author><pubDate>Mon, 09 Aug 2021 11:29:54 +0800</pubDate><description><![CDATA[HashMap实现于Map接口，元素以键值对的方式存储，允许使用null键和null值，不能保证元素的顺序，是线程不安全的。
HashMap-Hashtable

Hashtable的方法都有synchronized修饰，是线程安全的
HashMap可以使用null作为key，而Hashtable不允许

这里重点说一下hashtable不允许null的情况，在HashMap中，key为null的时候做了特殊处理，hash的时候直接返回0，也就是key为null时在数组的第1个位置。而Hashtable直接]]></description><category></category></item><item><title><![CDATA[ArrayList源码及应用]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119522709</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119522709</guid><author>cow4j</author><pubDate>Sun, 08 Aug 2021 22:47:32 +0800</pubDate><description><![CDATA[ArrayList是一种List实现，它的内部用一个动态数组来存储元素，因此ArrayList能够在添加元素的时候进行动态的扩容。
数组
我们知道ArrayList查找效率高，这个都是基于数组来实现的，那么数组为什么查找效率高呢？

Java的数组中存储的每个元素类型一致，每个元素占用的空间大小相同。
Java数组中存储的每个元素，内存地址是连续的。
通常首元素的内存地址作为整个数组对象的内存地址。
数组中的元素是有下标的，有下标就可以计算出被查找的元素和首元素的偏移量。

实际上数组中查找元素是可以通过计]]></description><category></category></item><item><title><![CDATA[四张图看懂线程池]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119426823</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119426823</guid><author>cow4j</author><pubDate>Thu, 05 Aug 2021 20:46:27 +0800</pubDate><description><![CDATA[线程池
程序的运行，本质上是对系统资源(CPU、内存、磁盘、网络等)的使用。如何高效的使用这些资源，是编程优化演进的一个方向。线程池就是一种对CPU利用的优化手段。
池化技术
池化技术就是提前保存大量的资源，以备不时之需。在机器资源有限的情况下，使用池化技术可以大大的提高资源的利用率，以此来提升性能。
在编程领域，一些常用的池化技术有(线程池、连接池、内存池、对象池等)。
带着问题看线程池

线程池的线程是如何做到复用的？

当线程小于核心线程数时，队列中的取数据使用take方法，该方法中使用了线程的awa]]></description><category></category></item><item><title><![CDATA[Java线程的底层原理]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119335130</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119335130</guid><author>cow4j</author><pubDate>Mon, 02 Aug 2021 22:07:31 +0800</pubDate><description><![CDATA[线程
线程是CPU独立调度的单位，通过引入线程，实现时分复用，利用并发思想使我们的程序运行的更加迅速。
线程与语言无关，由操作系统来实现，主要有3种实现方式：

用户级线程
内核级线程
用户级线程+内核级线程

内核线程
内核线程就是直接由操作系统内核支持的线程，这种线程由内核来完成线程切换。
用户线程
一个线程只要不是内核线程，就可以认为是用户线程。
Java线程
Java线程是映射到操作系统的内核线程上的。
要启动一个Java线程，主要有两种方式：

继承Thread
实现Runnable

packa]]></description><category></category></item><item><title><![CDATA[Java环境安装]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119261591</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119261591</guid><author>cow4j</author><pubDate>Sat, 31 Jul 2021 02:35:22 +0800</pubDate><description><![CDATA[JDK安装
要编写Java代码，第一件事情就是安装JDK，只有安装了JDK我们才可以运行​Java代码。jdk官网下载一时搞不定的，可以直接到百度网盘下载。
链接: https://pan.baidu.com/s/1j6z79hxuwUhiWSA897Wncg 提取码: y9i2
官网下载JDK，百度搜索JDK进入oracle官网

进入网站后，往下找到Java Archive

这里有各版本JDK的下载地址，我们后面都使用8这个版本，这也是现在常用的版本。

找到对应系统版本的JDK，点击后面的下载链接。]]></description><category></category></item><item><title><![CDATA[学Java的疑惑]]></title><link>https://blog.youkuaiyun.com/cow4j/article/details/119261491</link><guid>https://blog.youkuaiyun.com/cow4j/article/details/119261491</guid><author>cow4j</author><pubDate>Sat, 31 Jul 2021 02:24:49 +0800</pubDate><description><![CDATA[学Java的疑惑
1）零基础能够学Java吗？
零基础是最好学Java的，所有的学习都要有一个空杯心态，往往懂一点的人都不具备空杯心态，导致学习比较困难，总以为自己都懂。而零基础的正好相反，什么都不懂，反而可以学得更好。总之，无论何时，保持空杯心态，慢慢来，就会有收获。
2）不会英文能学Java吗？
首先，编程跟英文没关系。你看到的那些编程代码跟英文没有一点关系。只要你认识键盘上面有的字符，你就可以学。
3）现在学Java来得及吗？
目前，大部分公司都有自己的软件，而且越来越多，虽然程序员也很多，但是对于互]]></description><category></category></item></channel></rss>