随笔分类 -  Java

摘要:HashMap的put方法执行过程可以通过下图来理解,自己有兴趣可以去对比源码更清楚地研究学习。 ①.判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容; ②.根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向⑥,如果table[i]不为空,转向③; ③.判table[i]的首个元素是否和key一样,如果相... 阅读全文
posted @ 2019-03-08 23:32 robin·张 阅读(828) 评论(0) 推荐(0) 编辑
摘要:ProxyFacotryBean是FacotryBean的一种实现,FacotryBean要产生bean都要重写getObject方法,而ProxyFacotryBean这里的这个getObject正是为代理做了准备并返回代理对象。首先用initializeAdvisorChain(第一次去取代理对象时初始化一遍)初始化Advisor链后对于singleton和prototype进行区分生成对应... 阅读全文
posted @ 2019-02-16 22:05 robin·张 阅读(815) 评论(0) 推荐(0) 编辑
摘要:容器初始化 容器的初始化首先是在对应的构造器中进行,在applicationContext的实现类构造器中,首先对参数路径中的${}进行了处理,用系统变量替换(setConfigLocations方法)然后调用refresh方法(这个就是最核心的容器初始化方法)。 1、Resource定位: 在refresh方法中调用obtainFreshBeanFactory方法告诉子类刷新beanfacto... 阅读全文
posted @ 2019-02-16 22:01 robin·张 阅读(210) 评论(0) 推荐(0) 编辑
摘要:sentinel简介 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)没有实现自动进行主备切换。而Redis-sentinel是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。 它的主要功能有以下几点: ... 阅读全文
posted @ 2019-02-15 00:26 robin·张 阅读(132) 评论(0) 推荐(0) 编辑
摘要:Master&Slave也就是我们所说的主从复制,即主机数据更新后根据配置和策略,自动同步到备机的机制。其中Master以写为主,Slave以读为主。 Master&Slave的作用主要有两个: 读写分离; 容灾恢复。 redis replication核心机制 redis采用异步的形式复制数据到slave,从redis 2.8开始,slave会周期性地确认自己每次复制的数据量 一个maste... 阅读全文
posted @ 2019-02-15 00:16 robin·张 阅读(265) 评论(0) 推荐(0) 编辑
摘要:Redis简介 Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存和消息中间件。 它支持多种类型的数据结构,如字符串(String),散列(Hash),列表(List),集合(Set),有序集合(Sorted Set或者是ZSet)与范围查询,Bitmaps,Hyperloglogs 和地理空间(Geospatial)索引半径查询。其中常见的数据结构类型有:String、Li... 阅读全文
posted @ 2019-02-13 23:49 robin·张 阅读(197) 评论(0) 推荐(0) 编辑
摘要:客户端方案 禁掉提交按钮。 表单提交后使用Javascript使提交按钮disable。这种方法防止心急的用户多次点击按钮。但有个问题,如果客户端把Javascript给禁止掉,这种方法就无效了。 使用Post/Redirect/Get模式 在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信... 阅读全文
posted @ 2019-02-02 23:03 robin·张 阅读(932) 评论(0) 推荐(0) 编辑
摘要:主要是因为i++这个操作不是原子性的,它会编译成 i = i +1; 其实是做了3个步骤,一个是读取,修改,写入 。所以会出现多线程访问冲突问题。 可以结合Java内存模型来进行说明。 阅读全文
posted @ 2019-02-01 23:44 robin·张 阅读(673) 评论(0) 推荐(0) 编辑
摘要:先看下三次握手四次挥手的状态变化: 通常会遇到下面两种情况: 服务器保持了大量TIME_WAIT状态 服务器保持了大量CLOSE_WAIT状态 因为linux分配给一个用户的文件句柄是有限的,而TIME_WAIT和CLOSE_WAIT两种状态如果一直被保持,那么意味着对应数目的通道就一直被占着,而且 阅读全文
posted @ 2019-02-01 23:39 robin·张 阅读(301) 评论(0) 推荐(0) 编辑
摘要:TCP头部 源端口和目的端口在TCP层确定双方进程,序列号表示的是报文段数据中的第一个字节号,ACK表示确认号,该确认号的发送方期待接收的下一个序列号,即最后被成功接收的数据字节序列号加1,这个字段只有在ACK位被启用的时候才有效。 当新建一个连接时,从客户端发送到服务端的第一个报文段的SYN位被启用,这称为SYN报文段,这时序列号字段包含了在本次连接的这个方向上要使用的第一个序列号,即初始序列... 阅读全文
posted @ 2019-01-31 23:02 robin·张 阅读(311) 评论(0) 推荐(0) 编辑
摘要:get和post的区别可以从三个层面来说:浏览器/服务器层面、HTTP协议层面、语义层面。 浏览器/服务器层面 二者在浏览器层面有着多方面的不同: GET把参数写在URL中,POST通过body来传参。 GET后退按钮/刷新无害,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交)。 GET书签可收藏,POST为书签不可收藏。 GET能被缓存,POST不能缓存 。 GET编码类型app... 阅读全文
posted @ 2019-01-30 23:25 robin·张 阅读(232) 评论(0) 推荐(0) 编辑
摘要:session其实分为服务器端Session和客户端Session。 当用户首次与Web服务器建立连接的时候,服务器会给用户分发一个sessionid作为标识。用户每次提交页面,浏览器都会把这个sessionid包含在 HTTP头中提交给Web服务器,这样Web服务器就能区分当前请求页面的是哪一个客户端。这个sessionid就是保存在客户端的,属于客户端Session。 tomcat生成的ses... 阅读全文
posted @ 2019-01-29 23:41 robin·张 阅读(252) 评论(0) 推荐(0) 编辑
摘要:二者的区别简单说就是Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。 关于Cookie Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。 当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检... 阅读全文
posted @ 2019-01-29 23:08 robin·张 阅读(307) 评论(0) 推荐(0) 编辑
摘要:先说结论:servlet不是线程安全的。 servlet运行过程 Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后: ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。 ②装载并创建该Servlet的一个实例对象。 ③调用Servlet实例对象的init()方法。 ④创建一个用于封装HTTP请... 阅读全文
posted @ 2019-01-28 23:17 robin·张 阅读(215) 评论(0) 推荐(0) 编辑
摘要:AQS即队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架。 AQS使用了一个int成员变量表示同步状态。 AQS通过内置的FIFO双向队列来完成获取锁线程的排队工作 同步器包含两个节点类型的应用,一个指向头节点,一个指向尾节点,未获取到锁的线程会创建节点线程安全(compareAndSetTail)的加入队列尾部。同步队列遵... 阅读全文
posted @ 2019-01-27 22:33 robin·张 阅读(205) 评论(0) 推荐(0) 编辑
摘要:无锁竞争的情况下为了减少锁竞争的资源开销,引入偏向锁。 阅读全文
posted @ 2019-01-27 22:19 robin·张 阅读(145) 评论(0) 推荐(0) 编辑
摘要:轻量级锁所适应的场景是线程交替执行同步块的情况。 阅读全文
posted @ 2019-01-27 22:13 robin·张 阅读(152) 评论(0) 推荐(0) 编辑
摘要:Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。因此,这种依赖于操作系统Mutex Lock所实现的锁我们称之为“重量级锁”。 JD... 阅读全文
posted @ 2019-01-27 22:10 robin·张 阅读(136) 评论(0) 推荐(0) 编辑
摘要:CAS,在Java并发应用中通常指CompareAndSwap或CompareAndSet,即比较并交换。 CAS是一个原子操作,它比较一个内存位置的值并且只有相等时修改这个内存位置的值为新的值,保证了新的值总是基于最新的信息计算的,如果有其他线程在这期间修改了这个值则CAS失败。CAS返回是否成功或者内存位置原来的值用于判断是否CAS成功。 JVM中的CAS操作是利用了处理器提供的CMPXCHG... 阅读全文
posted @ 2019-01-27 22:06 robin·张 阅读(165) 评论(0) 推荐(0) 编辑
摘要:如果一系列的连续操作都对同一个对象反复加锁和解锁,甚至加锁操作是出现在循环体中的,那即使没有线程竞争,频繁地进行互斥同步操作也会导致不必要的性能损耗。 如果虚拟机探测到有这样一串零碎的操作都对同一个对象加锁,将会把加锁同步的范围扩展(膨胀)到整个操作序列的外部(由多次加锁编程只加锁一次)。 一种需要锁粗化的极端的情况是: for(int i=0;i<size;i++){ synchroni... 阅读全文
posted @ 2019-01-27 22:04 robin·张 阅读(634) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示