自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

吴永胡的博客

知识在于积累

  • 博客(523)
  • 资源 (9)
  • 论坛 (1)

原创 腾讯面试题(1)--自测试

1、java中的几种基本数据类型是什么?各自占用多少个字节?1布尔1字符,4整形2浮点。12124848.2、String类可以被继承吗?为什么?String类是不能被继承的,因为有final关键字修饰。3、String、StringBuffer、StringBuilder的区别(有buffer的线程安全,但是速度慢,没有buffer的线程不安全,但是速度快)String:String的值是不可变的StringBuffer:StringBuffer的值可变,线程安全,但是效率比String

2020-06-11 16:15:50 231

原创 什么是MD5算法--抄自小灰

1、什么是信息摘要信息摘要把明文内容按某种规则生成一段哈希值,即使明文消息只改动了一点点,生成的结果也会完全不同。md5就是消息摘要的一种实现,可以从任意长度的明文字符串生成128位的哈希值。摘要哈希生成的步骤为:1、收集相关业务参数,比如金额与目标账户2、按照规则,把参数名和参数值拼接成一个字符串,同时把给定的密钥也拼接起来,之所以需要密钥,是因为攻击者也可能获知拼接规则。3、利用md5算法,从原文生成哈希值,Md5生成的哈希值是128位二进制数,也就是32位的16进制数。如三方支付平台如何

2020-06-11 14:15:13 177

原创 什么是SHA系列算法--抄自小灰

1、简介和md5算法类似,sha也是一种生成信息摘要的算法,而由于该算法分为很多版本,最大的版本分类是sha-1和sha-2,sha-2又包含了很多子版本。2、sha-1sha-1算法可以从明文生成160bit的信息摘要,示例如下:sha-1与md5的主要区别是什么呢?1、摘要长度不同2、sha-1生成摘要的性能比md5低一点而且sha-1已经被人破解了。3、sha-2sha-2是一系列算法的总称,包含以下子版本:信息摘要越长,发生碰撞的几率就越低,破解的难度就越大,但同时,耗费的性

2020-06-11 13:55:23 245

原创 什么是AES算法--抄自小灰

AES算法是典型的对此加密算法1、对称加密算法示例传送过程中不使用明文,而改用对称加密的方式传输密文时,如下所示:1、发送方使用秘钥对信息进行加密2、接收方使用同样的秘钥对信息进行解密2、AES算法要学习AES算法,首先要清楚三个基本的概念,秘钥、填充、模式1、密钥密钥是AES算法实现加密和解密的根本,对称加密算法之所以对称,是因为这类算法对明文的加密和解密要使用同一个密钥。AES支持三种长度的秘钥:128位、192位、256位。平时大家所说的AES128、AES192、AES256,实

2020-06-11 11:29:26 91

原创 什么是ConcurrentHashMap--抄自小灰

hashmap不是线程安全的,在并发插入元素的时候,有可能出现带环链表,让下一次读操作出现死循环。想要避免hashmap的线程安全问题有很多办法,比如改用hashtable或者collections.synchronizedMap。但是这两者都有一个问题,就是性能。无论是读操作还是写操作,它们都会给整个集合加锁,导致同一时间的其他操作阻塞。如下图所示:为了在并发环境下,能兼顾线程安全和运行效率,ConcurrentHashmap就应运而生了。1、ConcurrentHahMapConcurrent

2020-05-27 16:29:22 90

原创 高并发下的hashMap--抄自小灰

1、什么是rehash?rehash就是hashmap在扩容时候的一个步骤。hashmap的容量是有限的,当经过多次元素插入,使得hashmap达到一定饱和度时,key映射位置发生冲突的几率会逐渐提高,这时候,hashmap需要扩展它的长度,也就是进行resize。影响发生resize的因素有两个:1、capacity:hashmap的当前长度。2、loadfactor:hashmap的负载因子,默认值是0.75f。综合来说,当hashmap.size>=capacityloadfacto

2020-05-27 16:04:20 72

原创 什么是hashMap--抄自小灰

1、hashmap是一个用于存储key-value键值对的集合,每一个键值对也叫做Entry。这些键值对分散存储在一个数组当中,这个数组就是hashmap的主干。hashmap数组每一个元素的初始值都是Null。对于hashmap,最常使用的两个方法:get 和 put2、put方法的原理调用put方法的时候发生了什么呢?比如调用hashMap.put(“apple”,0),插入一个key为apple的元素,而上面有说到数组是hashmap的主干,那么也就是说需要知道新插入的元素所在的数组的下标。

2020-05-27 15:30:21 70

原创 什么是zookeeer--抄自小灰

定位:zookeeper是一个分布式协调服务,可以在分布式系统中共享配置,协调锁资源,提供命名服务1、zookeeper的数据模型:(类似数据结构中的树、文件系统的目录)树是由节点组成,zookeeper的数据存储也是基于节点,这种节点称为Znode,znode的引用方式就是路径引用。如下所示:2、znode中都包含了什么?data:znode存储的数据信息acl:记录znode的访问权限,即哪些人或哪些IP可以访问本节点stat:包含znode的各种元数据,比如事务ID、版本号、时间戳、

2020-05-27 11:26:41 54

原创 如何使用zookeepe实现分布式锁--抄自小灰

1、zookeeper的四种节点类型:a、持久节点:默认的节点类型,创建节点的客户端和zookeeper断开连接后,该节点依旧存在。b、持久节点顺序节点:在创建节点时,zookeeper根据创建的时间顺序给节点名称进行编号。如下所示:c、临时节点和持久节点相反,当创建节点的客户端与zookeeper断开连接后,临时节点会被删除。d、临时顺序节点临时顺序节点,结合了临时节点和顺序节点的特点:在创建节点时,zookeeper根据创建的时间顺序和该节点名称进行编号。当创建节点的客户端与zooke.

2020-05-27 10:24:24 74

原创 如何使用redis实现分布式锁--抄自小灰

Redis分布式锁的基本流程并不难理解,但要想写得尽善尽美,也并不是那么容易,分布式锁的三个核心要素:1、加锁最简单的办法是使用setnx命令。key是锁的唯一标识,按业务来决定命名。比如想要给一种商品的秒杀活动加锁,可以给key命名为“lock_sale_商品ID”,而value设置成什么呢?暂时可以考虑设置为1.即:setnx(key,1)当一个线程使用setnx返回1,则说明key原来不存在,该线程成功获取了锁。当一个线程执行setnx返回0,说明key已经存在,抢锁失败。2、解锁有加锁就

2020-05-26 19:53:37 84

原创 分布式ID生成方案

1、方案一:数据库自增长序列或字段比如用户的ID值,就可以通过在数据库的用户表中新增一个字段,然后这个字段可以设置为每次增长n。比如库1每次增长2,库2每次增长1。(当前系统使用的方案)alter table t_ott_account add column user_id bigint;CREATE SEQUENCE user_id_seqSTART WITH 1INCREMENT BY 1NO MINVALUENO MAXVALUECACHE 1;alter sequence user

2020-05-26 14:02:48 91

原创 读码农翻身之Zookeeper

1、分布式RPC存在的问题假如后端的订单服务提供了四台服务器给客户端使用,而客户端使用的是配置文件的方式配置了后端服务的地址,那么问题就出现了,如果后台的订单服务故障或者新增了新的服务器,客户端是无法实时知道的,这就导致服务不稳定。2、抽象一下:注册中心可以考虑提供一个注册中心,客户端如果需要服务时,直接请求注册中心来获取。而注册中心返回一个可用的地址。这个注册中心的数据结构如果设计为树形结构,如下所示:其中/orderService表达了一个服务的概念,而下面的每个节点表示的是一个服务的实

2020-05-25 15:54:36 65

原创 读码农翻身之负载均衡的原理(LVS)

1、隐藏真实服务器当一台服务器无法满足用户的请求量时,首先的方案就是将系统多部署几份,这样用户的访问请求就可以分散到各个服务器,这样单台服务器的压力就小得多了。但是需要面对的问题就是,对于客户来说,最好只有一个服务器。此时我们能想到的,就是DNS,可以设置一下,让对外的域名映射到多个服务器的IP,用户面对的是系统的域名,然后可以采用轮询的方式,如下图所示:但是这样存在一个问题,因为DNS这个分层系统是存在缓存的,且用户端的机器也有缓存,如果某个机器出现了故障,域名解析的却还是那个机器,那么用户访问就

2020-05-25 14:20:30 90

原创 读码农翻身之分布式与集群

1、分布式的情况假如ABC三个系统分别部署在三台服务器上,他们之间互相调用,来完成业务流程。这就是一个分布式系统,但是从上面可以看出,如果系统A异常,就会引起单点失败。导致整个系统异常。2、集群为了解决上面的单点问题,有一种方式就是将系统A多部署几台,当然,这里能否部署多台需要具体的业务逻辑来决定,有些系统多台部署是可能出现问题的。如果部署多台业务正常,那么此时需要考虑的,就是如何让所有请求均匀的分布在每台系统上了。3、负载均衡常用的负载均衡的工具有nginx,如下图所示,但是这种场景还是可能

2020-05-25 10:38:07 45

原创 读码农翻身之AOP

AOP(Aspect Oriented Programming):面向切面编程1、为什么需要AOP?又回到了一个特别有意思的示例,代码写完后,如果每个方法的前后需要添加日志,你要怎么办?最简单的办法就是手动在所有的方法前后都调用记录日志的方法,来实现这个功能。听说这样的话,写出来的代码就是下面这样的:这样确实能实现功能,但是整个代码就显得非常的臃肿。本来一个方法里面的主要业务逻辑反而显得不够重要了。2、AOP出现了借用下面的这种图,像日志、安全、事务等这些需求,如果空间想象力丰富的话,是可以像下

2020-05-22 17:17:03 69

原创 依赖注入与控制反转

1、为什么需要依赖注入如果对象A需要调用对象B的方法,那么对象A如何获取到对象B的引用呢?最简单的办法就是new出一个新的对象出来。但是这样的问题,是后续维护会很麻烦。2、什么是依赖注入把有依赖关系的类放到容器中,解析出这些类的实例,就是依赖注入。目的是实现类的解耦。(打个比方来理解吧,我现在想玩电脑,但是我没有电脑,那么有一种方式,就是我自己组装一个电脑—相当于new一个新的对象出来,这样显然是很麻烦的。 而看看另一种方式,我直接去卖电脑的商家那里拿一台组装好的电脑,直接使用,这样岂不是更加的容

2020-05-22 16:56:05 52

原创 读码农翻身之用来维护本线程变量的ThreadLocal

1、为什么需要ThreadLocal?来看这样一个实例,在某个类中,创建了一个Context的对象,其中设置了一个trackerID,然后再调用了其他的java类,然后最终需要使用到ctx的这个tranckerID要怎么办?有人想,直接把Context对象一层层传递下去,这样到时候就可以用到了但是这样的缺点,就是太麻烦,有时候改动会很大。此时又有人认为可以把set/get TrackerID的方法修改为static静态方法。但是这样多线程并发的时候有可能出问题。(因为线程1调用了set,然后线

2020-05-22 15:12:17 84

原创 读码农翻身之Java虚拟机的堆

回顾一下java内存区域划分:1、Heap中主要保存对象2、垃圾回收:java程序员只需要将对象给new出来,扔到heap中,但是从来不把它delete掉,所以需要有垃圾回收机制来删掉这些对象。而这其中也涉及到一些算法如 可达性分析算法:橙色的对象都是不可达对象,可以回收3、Heap的详解可以把Heap想象成一大片空间,为了方便管理,把heap划分为多个区域,然后把那些java对象在其中搬来搬去。规定:新创建出来的对象,是保存在新生代中的,如果新生代住不下了,就进行垃圾回收(Minor G

2020-05-22 14:42:32 65

原创 读码农翻身之ASM

1、什么是ASMASM可以动态的修改已经编译过的class,还可以动态的生成新的java class。(动态:表示完全在运行时,在内存中完成的)之所以叫ASM,创造者在创造的时候,为了起名大费周章,后来突然想到C语言中的__asm__这个关键字,可以允许在C语言中写点汇编。就把ASM这个关键字挪用了。2、为什么需要ASM能对现有的class进行修改3、怎么实现动态修改类?ASM的核心主要是三个类,ClassReader、ClassWriter、ClassVisitor,用这三个类就可以去解析一个

2020-05-22 14:02:53 73

原创 读码农翻身之JMS

1、为什么需要JMS?JMS即Java消息服务(Java Message Service),随着各种消息队列的出现,定义了各式各样的API,导致互不兼容,学习成本高。使用不方便。2、定义标准消息生产者、消息消费者、生产者提供发送消息的方法,消费者提供接收消息的方法。不管是生产者向队列发送消息,还是消费者去接收消息,其实都是在和消息队列进行交互。所以引入一个会话(session)的概念出来。Session可以创建消息,同时生产者和消费者也应该由Session来创建,一个发送接收消息肯定是在一个会话里

2020-05-22 11:27:34 78

原创 读码农翻身之消息队列

1、为什么需要消息队列?假如有一个购物系统,逻辑上分为订单系统和库存系统,订单来了以后,先在订单系统中存下来,然后通知库存系统发货。此时这个购物系统是部署在一台服务器上的。但是当用户量越来越多的时候,服务器慢慢的快扛不住了。慢慢的进行了拆分的操作,即订单系统和库存系统,分别在两台服务器上进行保存,也就是现在订单系统如果要通知库存系统,那么就需要从原来的java方法调用,换成了http调用。那么这个时候又可能出现问题,因为现在有http请求,那么就意味着http请求有可能是不通的,那么如果失败后,

2020-05-22 11:08:49 73

原创 读码农翻身之安全

1、JAASJava Authentication Authorization Service,简称JAAS,属于jdk的标准包的一部分。然而用的人却不多。2、认证与授权认证就是确定你是谁,通常需要验证对方提供的用户名和密码。授权就是确定你能做什么,比如能否创建账号,能否删除用户等等。3、替换JAAS的JSecurity:从以上的代码来看,通过用户名和密码登录后,会返回一个token,然后使用这个token进行了登录的操作, 然后就能判断当前用户是否属于admin的这个角色,判断当前用户是否如果

2020-05-22 10:39:52 75

原创 读码农翻身之分布式事务

1、为什么会出现分布式事务如果数据库是单台的,不会有分布式事务的问题,但是如果系统随着用户量的增加,不得已只能将用户信息分别保存在不同的数据库中,就只能使用分布式事务了。2、分布式事务方案之两阶段提交(JTA: java transaction API ):由于涉及到多个分布式的数据库,设置一个全局的事务管理器,来负责协调各个数据库的事务提交,为了实现分布式事务,设置两个阶段:a、全局的事务管理器向各个数据库发出准备消息,各个数据库需要在本地把一切准备好,执行操作,锁住资源,记录redo/undo日

2020-05-20 17:22:20 60

原创 读码农翻身之java注解

1、为什么需要java注解?xml配置方式太过于复杂繁琐?2、什么是注解?所谓的注解有点像加强版的注释,这个注释不但有一定的格式,还有特定的含义。这样别的工具就可以读取它来做事情了。3、如何使用注解?如下所示,@Test这个注解,当@Test修饰了方法,表示这个方法可以作为测试用例来运行。而在运行时,可以通过反射的方式取出方法的注解,然后通过反射去执行这个方法。...

2020-05-20 16:28:44 48

原创 读码农翻身之CGLib动态代理方式

jdk原生动态代理方式 VS CGLib动态代理方式诞生历程:1、需求:在运行时对一个类进行扩展,比如有个类叫HelloWorld,需要在运行时加点日志输出的代码:2、思路:java不能在运行时对一个类进行修改,那就只能动态生成一个新类。让这个类作为代理去加日志。3、问题:如下所示,生成的新类和原类没有直接关系,那么无法调用sayHello方法:那么就要让这个动态生成的HelloWorldProxy继承自HelloWorld。如下所示:4、问题:复用性不够如上所示,当前只是一个He

2020-05-20 16:14:32 58

原创 读码农翻身之动态代理

1、为什么需要动态代理?原因:不能在运行时修改一个类,导致不能用声明的方式来编程。(以我个人观点来看,在实际工作做还没有遇到过在程序运行的时候去修改一个类。可能是自己孤陋寡闻了)2、什么是在运行时修改一个类?如:下面这个类中有两个方法当这个类运行起来后,要能做到在运行的时候修改这个类,比如在这个类中加一个新方法等等3、什么是声明的方式编程?实际需求中,写完代码以后,比如像在某些函数调用前后加上日志记录、事务、权限控制等等,这些需求是通用的,但是如果在每个函数中都实现一遍,重复代码太多。故希望

2020-05-20 15:56:11 43

原创 读码农翻身之泛型

1、为什么需要泛型?简而言之,主要是为了严谨。如下所示,如果没有泛型,那么在一个List中添加两个不同类型的元素那么在使用的时候,很有可能会出现以下的错误信息。2、什么是泛型其实从语法上来看,如上所示,泛型其实就是限制了某个list中只能保存某种类型的元素而已。...

2020-05-20 15:30:01 56

原创 读码农翻身之我是一个java Class

1、总体流程图:2、加载java class的流程:a、app classLoader(类加载器)通过全限定类名找到需要加载的类,(此时这个class文件还在硬盘上)b、app classloader在装载类之前,需要让更高层的class loader去加载。这样是为了安全。c、文件验证器需要验证java类是否合法等等d、之后会将java类加载到方法区中(java内存区域:堆、栈、方法区、程序计数器、本地方法栈。而其中的方法区就是用来类的相关信息以及常量池)...

2020-05-20 15:17:28 53

原创 读码农翻身之Actor

1、如何解决需要加锁的问题?既然线程是操作系统层面的概念,能不能把线程的概念隐藏起来,然后所有的操作都不用加锁呢?2、为什么需要加锁?需要加锁的本质是什么?首先是共享的状态,例如Account中的balance,多个线程都要读写,其次就是多个线程乱序,并发执行。能不能换个思路,把这个Account对象看成一个黑盒子,想存款,就发一个存款的消息过来,想取款就发一个取款的消息过来。不管是有一个消息,还是有100个消息,统统放到黑盒子的一个队列中,然后让Account对象一个个顺序处理。相当于将并发的操作

2020-05-18 19:02:39 56

原创 java中的死锁以及处理方案

1、先模拟一下死锁的情况:package deadlock;public class Account{ private String userId; private int balance; public Account(String userId, int balance) { super(); this.userId = userId; this.balance = balance; } pub

2020-05-18 18:50:37 30

原创 读码农翻身之计算机核心概念

1、冯诺依曼结构计算机原理所有的计算机语言,最终都要变成基本的二进制指令,在冯诺依曼结构计算机上按规矩执行。CPU从内存取出指令,进行译码和执行,执行时从内存中取出数据放到寄存器中,进行计算,然后把结果写回到内存,如果是跳转指令,CPU则取出跳转目的地的指令继续执行。其实,计算机最底层的原理,我觉得其实只是各种电路而已,而电路又是由电作为基础的,所以计算机的底层其实说到底是电学。2、进程和线程每个进程都有一个被操作系统维护的进程控制块,里面保存了这个进程在运行时的重要信息,是进程能来回切换的重要保

2020-05-18 14:48:45 46

原创 读码农翻身之加法器与减法器

1、使用逻辑电路可以实现一个加法器:2、如何使用加法来表示减法在定义的4位二进制中,一共可以表达16个数,可以引入一个补数的概念。例如3的补数是13,4的补数是12,5的补数是11,当你计算7减去3的时候,可以变成7加上3的补数,结果为20,而20已经超出了4位二进制能表达的16个数了,已经溢出,所以将20减去16,得到4.那么如何得到一个数的补数呢?有一个异常简单的方法,对二进制数的所有位取反,然后加13、负数的表示用一个标志位来表示整数还是负数。最高位的0表示正数,1表示负数,真正有

2020-05-18 14:21:41 44

原创 读码农翻身之MVCC--多版本并发控制

多版本并发控制要解决的问题,其实就是基于可重复读的情况下,可以在读的时候不用加锁,也可以实现可重复读。可重复读的流程如下所示:(小强在读取B的信息时候,需要加锁)1、假设数据库中有一张users的表,里面有如下一行数据:2、先给这行数据添加两个隐藏的字段:其中事务ID表明这行数据是哪个事务操作的。(事务ID是一个递增的数字,每次开始新的事务,这个数字就会增加)3、假如旺财和小强都在操作这行数据,且分别在不同的事务中。那么当旺财执行到上图的第一步的时候,数据是这样的:然后,创建一个叫做Re

2020-05-18 11:42:24 57

原创 读码农翻身之数据库隔离级别

1、如果当两个用户对同一个账户进行读写操作的时候,可能会出现如下的错误信息,这种情况称为“丢失修改”。其实原因就是因为没有加锁导致的。2、排他锁。当某个用户需要写数据的时候,就添加一把锁,修改后方案如下所示:3、脏数据因为锁只有在写数据的时候用到,而读数据的时候是不用加锁的。那么如果出现如下这种情况:很显然,这里就出现了脏数据。那如果在读数据的时候也添加锁呢?这样又感觉太过于繁琐了4、共享锁:解决脏数据的问题共享锁专门用于共享数据的读取,这个锁和之前的排他锁有区别,主要用于读取数据,如果一

2020-05-18 11:18:24 56

原创 读码农翻身之加锁还是不加锁,这是一个问题

首先,就我个人的意见,实际工作中,如果接口只涉及到数据的查询,我感觉是没有必要加锁的,只有那些涉及到数据的更新时,才考虑加锁。1、乐观锁和悲观锁上一章我们讨论到了自旋锁以及其优化的各种锁,从某种意义上来说,由于这种锁是以共享变量一定会被线程同时修改这种悲观的想法设计的,所以有些地方称之为悲观锁,所以以辩证法的观点来看,是不是有一种乐观锁,只有当确实发现共享变量被多个线程同时修改了,才做处理呢?这样就能在保证数据的一致性的前提下,大量减少资源的开销,这种锁确实是存在的。2、乐观锁与CAS乐观锁是如果实

2020-05-15 14:39:30 45

原创 读码农翻身之编程世界的那把锁

1、为什么需要锁?比如有两个线程,分别记为A和B,有一个变量记为X=100,假如线程A先获取到X的值,然后将X加2,而在A没有将102复制到X之前,线程B将X减少了5变成了95,那么此时线程A就会将X的值从95重新修改为102。很显然,这样是有问题的!2、锁的诞生任何线程,如果想要操作一个共享变量,需要先申请一把锁,拿到这把锁才能去读取X的值,修改X的值,把X的值重新写回内存。最后再释放锁。这就是锁的定义,那么锁是如何实现的呢?其实底层就是有一个类似boolean的变量,如:boolean lock=

2020-05-15 14:15:13 48

原创 读码农翻身之操作系统

1、基本流程:程序首先保存在硬盘中,当被操作系统装载后,进入内存,然后被CPU执行。2、操作系统装载程序的流程:a、虚拟内存:每个程序可能会认为自己有较大的(如3G)的内存,而实际上并不是就分配给了你3G的物理内存,而是虚拟内存。(虚拟内存中使用页表把代码在硬盘中的位置记录下来,等真正需要运行的时候才会被装载)b、分页:不会将程序全部装入物理内存,而是将程序拆分开来,分块按需装入。c、CPU切换:CPU不会一直执行某个程序,而是以极快的速度,不断切换当前执行的程序。因为速度极快,所以人类可能没

2020-05-15 11:28:04 133

原创 读码农翻身之递归

1、什么是递归:如上所示,这是一个递归函数,所为递归,就是一个函数调用了自己。或者说一个函数在函数内部调用了另一个函数,而这另一个函数的功能和本身这个函数的作用一样。虽然从理论上来说,这样确实是讲得通的,那么作为最终要在计算机中执行的程序,在内存中是什么样的呢?当代码编译以后,函数会被放在代码段。(只有一套代码放在代码段!)而上图中的栈帧就代表了被调用中的一个函数,这些函数栈帧以先进后出的方式排列起来,形成了一个栈,而每个栈帧的详细信息其实如下所示:那么意思就是每次调用一个函数,就会在栈中压入一

2020-05-15 11:08:32 72

原创 读码农翻身之socket

1、为什么需要Socket呢?我们知道,当存在了TCP/IP后,那么http协议应该就开发出来了,通过http协议,主机之间就可以进行通信了。但是这样存在一个问题,http是无状态协议,比如我们现在需要做一个类似QQ的实时聊天工具时,只使用http显然是无法满足的,因为甲方希望自己发送的消息,乙方能实时的接收到。而乙方显然不能像一个死循环一个不断的使用http来调用甲方提供的接口。所以此时我们需要找到一个方法,能方便的让甲乙两方进行实时通信,而这个方法即Socket。2、Socket的使用示例a、So

2020-05-15 10:11:19 74

转载 JVM内存区域分析

JVM的内存区域如下所示:接下来开始逐个的分析:1、程序计数器是否还记得PCB?当多个程序在内存中进行切换的时候,由于单核CPU是需要不断的切换程序的,而在下次调用到已经运行过的程序时,由于需要知道该程序当前的一些状态,所以使用了PCB来进行记录。同理,在同一个进程中,因为是存在多个线程的,而多线程是通过线程轮流切换来获得CPU执行时间的,所以同样每个线程都需要有一个记录线程状态的东西,这个东西就是程序计数器。–程序计数器是每个线程私有的。2、栈一提到栈就会想到入栈和出栈,线程在执行方法的过程中

2020-05-14 19:35:53 49

redis自动化安装

支持redis单机,主从部署,文档齐全,yijia

2017-08-16

postgresql数据库自动化单机主从部署-吴永胡

postgresql数据库自动化单机主从部署

2017-08-09

postgresql数据库手动安装以及主从配置

postgresql数据库手动安装以及主从配置

2017-08-07

IT经典资料分享-含高清下载链接(第一版).pdf

IT经典资料分享-含高清下载链接(第一版).pdf

2017-07-07

SQLAlchemy详细教程

sqlAlchemy教程

2017-07-07

java项目中cas和authcenter的集成

CasClientUtil.java

2017-06-26

redis操作工具类

封装了所有对redis操作的工具

2017-04-26

nodejs开发微信公众号第三天代码 可以实现推送消息

nodejs开发微信公众号

2016-12-13

nodejs开发微信公众号第二天代码

慕课网开发微信第二天源代码

2016-12-12

谷悦古月的留言板

发表于 2020-01-02 最后回复 2020-01-02

空空如也
提示
确定要删除当前文章?
取消 删除