自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 线程安全之原子性

前言上一篇文章写到JMM规范描述了多线程程序的语义以及多线程程序会出现各种各样的灵异事件在编写多线程的时候如何避免掉这些灵异事件的发生,能让多程序程序更加符合程序员的意愿去执行今天我们就围绕着原子性这个概念来聊一聊要玩好多线程得先做好两件事:控制线程数量,不要让线程无限膨胀解决线程安全问题下面便以一个代码示例来正式进入原子性话题/** * <p> * 原子性示例 * </p> * * @author 昊天锤 * @date 2020/10/29 002

2020-11-01 20:06:30 495

原创 java内存模型和线程可见性

前言今天我们来聊一聊java内存模型和线程可见性问题首先我们先要知道java内存模型是什么它和jvm运行时数据区有什么区别java内存模型和jvm没有太强的联系也完全可以说它们是两个不同的概念为什么说同样一份java代码能够在不同的平台(windows、linux、unix)上正常运行因为java代码和操作系统压根就没多大关系,它是在虚拟机中执行的当然虚拟机也有很多种,比如说 HostSpot、TaoJvm.虽然虚拟机可以有多种,但是对于java代码而言基本上是没有任何区别java代码能够在不

2020-10-27 21:06:13 282

原创 低侵入内存缓存框架实现

前言前面聊了一些内存缓存相关的知识点:了解缓存技术常用的内存缓存框架针对caffeine框架实现原理进行源码分析缓存在使用过程中常见的问题及如何应对那么对于如何使用缓存以及缓存的实现原理在这里先告一段落了但是大家有没有想过一个问题,如果说已经上线了的系统,之前并没有使用缓存技术而现在因为系统性能问题需要利用缓存技术对现有的功能进行优化这时候应该如何设计才能保证在不影响现有功能的前提下最大程度的降低开发成本我们先来回顾一下使用缓存的常用操作查询数据时,先读取缓存,如

2020-10-24 21:09:03 179

原创 缓存使用常见问题及解决方案

前言利用缓存来提升应用程序性能固然好,那么在使用缓存的同时会不会带来什么问题呢?今天咋们聊聊使用缓存的过程中会遇到什么问题,又应当如何应对了解系统使用缓存后带来的问题掌握常见缓存一致性问题的解决方案应对缓存穿透、缓存击穿、缓存雪崩使用缓存常见的问题我们先回顾一下使用缓存缓存地处理流程缓存地使用极大地提升了应用程序的性能和效率,特别是数据查询方面.但同时它也带来了一些问题,其中最要害的就是数据一致性问题从严格意义上来讲这个问题是无解的,如果对实时性要求比较高的业务场景就不应该使用缓存,

2020-09-19 12:05:09 637

原创 caffeine实现原理(源码分析)

前言上篇文章介绍了常用的缓存框架,了解了目前内存缓存框架性能最好的是Caffeine本篇文章将详细从源码级讲解Caffeine内部实现原理,包含以下内容淘汰策略 tinyLFUCaffeine 内部接口关系load put invalidate 操作的原子性缓存过期策略解析缓存淘汰算法缓存淘汰算法的作用是在有限的资源内,尽可能识别出哪些数据在短时间会被重复利用,从而提高缓存的命中率LRU (Least Recently Used)该算法认为最近访问过的数据将来被访问的几率会更高,通常

2020-09-14 19:51:59 4712

原创 了解并使用常见的内存缓存框架

前言上一篇文章实现了一个简单的内存缓存工具类,相对来说还是比较简单的但是常用的内存缓存框架核心功能会不会也是这么实现的呢本次将介绍常用的内存缓存框架,主要围绕以下两点常见开源的内存缓存框架介绍及使用常见开源的内存缓存框架对比常用的内存缓存框架Guava CacheEhcacheCaffeineGuava CacheGoogle Guava Cache是一种非常优秀的本地缓存解决方案,提供了基于容量、时间、引用的缓存回收方式内部实现采用LRU算法,基于引用回收很好的利用了jav

2020-08-11 15:59:51 626

原创 实现简单的内存缓存

前言在上一篇文章中,我们详细介绍了缓存的一些理论知识,相信大家对于缓存的概念不会太过于陌生了为了更进一步的认识缓存,接下来我们将沿着缓存的一些理论知识基于java容器类来实现一个简单的内存缓存工具实现内存缓存的目的有以下两点掌握内存缓存的关键特性的实现策略了解如何设计功能完善的内存缓存工具回顾和推理在实现内存缓存工具之前,我们先回顾一下缓存具备的一些特点,还要尝试着去推理缓存的实现方案缓存具备的特点设置存活时间(过期策略)缓存通常需要设置有效期,过期后应当失效常见的过期

2020-08-06 10:11:02 398

原创 了解内存缓存

前言当应用系统有大量用户进行访问时,导致系统的TPS极速上升,查询数据直接打到了数据库达到了系统的性能瓶颈,接口的响应会变慢,用户体验变得非常差那么从技术架构的角度思考可以使用缓存技术对系统进行优化缓存是成本最低并且简单有效的一种技术架构方案缓存可以减轻系统的负载同时提高数据的传播效率缓存及其应用场景缓存介绍在计算机中,缓存是一个高速数据存储层,其中存储了数据子集且通常是短暂性存储这样日后再次请求此数据时要比访问数据的主存储位置快通过缓存可以高效地重用之前检索或计算的数据缓存分为以下三

2020-08-05 10:19:53 1542

原创 Tomcat性能调优

Tomcat网络处理线程模型tomcat是我们在web开发过程中会用到的servlet容器,同时也是springBoot内置集成默认的容器所以我们有必要去了解它的网络线程模型BIO+同步Servlettomcat8之前默认是BIO+同步Servlet的方式执行流程是步骤是1.用户请求2.nginx负责接收并转发到tomcat3.Tomcat具体使用的是BIOConnector 交由具体的Servlet4.Servlet处理业务逻辑这是典型的BIO操作,相信大家如果对NIO和Netty有

2020-07-20 09:12:30 632 1

原创 NIO网络编程

NIO始于java1.4提供了新的Java Io操作非阻塞API,其用意是替代Java IO和java Networking相关的API有很多人了解过NIO还有另一种说法叫做new io,因为它是新出来的IO API操作所以它有个名字叫新IO在网络编程中我们更偏向于叫他非阻塞IONIO中有三个核心组件组件含义Buffer缓冲区Channel通道Selector选择器这三个核心组件联合使用为我们提供了高性能网络编程的基础组件,也就是NIO网络编程都是基于这

2020-07-20 09:11:01 334

原创 BIO网络编程

前言之前我们已经了解了网络编程它是有操作系统统一的API的,每种语言又有不同的实现,所以本文主要讲述java最开始的一个Socket版本,使用java怎么去做一个BIO的网络编程,一步步开发根据现有问题升级改造,直到服务端能处理多个请求且能够支持HTTP网络协议服务端-单线程处理服务端代码/** * @author pangbohuan * @date 2020/6/17 0017 17:15 * @description BIOSocket服务端 */public class BioSo

2020-06-29 17:13:51 230

原创 网络协议

OSI网络七层模型为了使不同计算机厂家的计算机能够相互通讯,以便在更大的范围内建立计算机网络,有必要建立一个国际范围的网络体系结构标准.这是一套全球都在使用的,目的是为了构建一个最大范围的计算机网络网络七层模型分别指的是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层每一层的作用都可以作为一个单独的层次,我们可以这么去理解:分层的目的是为了让每一层次的开发设计人员不需要关心整个网络层次.比如说是做硬件的、做网线和光纤的那么只需要知道物理层而不需要关注什么是http.各层的主要功能七层

2020-06-17 17:32:09 337

原创 GC垃圾回收机制

前言对于java开发者而言如果想要java应用能在性能方面有所提升,那么就必须要对jvm进行调优jvm调优是一个没有明确定义正确方式的知识体系,因为每个程序的侧重点不同,只有不断地根据自身程序运行情况去尝试调优才能正确找到最合适当前程序的调优方式哈哈!读者可能感觉在扯犊子,没有明确定义那得怎么调呢?难道自己乱调吗?当然不是一无所知的去调优,前提是开发者需要了解类加载机制、GC回垃圾收机制、JVM的配置参数只有了解java程序运行底层逻辑,才能更准确地判断出当前程序需要配置什么样的参数配置后会达到什

2020-06-06 18:33:36 312

原创 JAVA类加载机制

运行时数据区方法区是JVM用来存储加载类的信息、常量、静态变量、编译后的代码等数据虚拟机规范中这是一个逻辑区域。具体实现根据不同来实现。如:oracle的HotSpot在java7中方法区放在永久代,java8放在元数据空间,并且通过GC机制对这个区域进行管理.一个类加载后的信息最终是放在了方法区里面,但是这个过程究竟是由谁来做的呢?要想知道class是怎么加载的得从类的生命周期开始说起类生命周期类加载器类加载器负责装入类,搜索网络、jar、zip、文件夹、二进制数据、内存等指定位置的类资源。

2020-06-01 19:49:56 240

原创 线程池原理

线程池作用思考线程有什么弊端?线程在java中是一个对象,更是操作系统的宝贵资源,线程创建和销毁都需要时间。如果创建时间+销毁时间 >执行时间就很不划算java对象占用堆内存,操作系统线程占用系统内存。根据JVM规范,一个线程默认最大栈大小1M,这个栈空间是需要从系统内存中分配的。线程过多,会消耗很多的内存操作系统需要频繁切换线程上下文(所有线程都想被运行)影响性能线程池的作用就是为了控制线程数量,管理线程生命周期线程池原理-概念线程池管理器用于创建并管理线程池,包括创建线程,销

2020-06-01 19:49:16 560

原创 请重新认识线程

线程状态在java.lang.Thread.State 明确定义了java线程中的状态可以看到线程状态枚举有定义了六种状态代码如下public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED;}新建状态-NEWnew一个线程但是还没有调用start方法Thread thread = new Thread();System.out.println(th

2020-06-01 19:44:45 192

原创 java程序运行原理分析

class文件内容class文件内容包含java程序执行的字节码,数据严格按照格式紧凑排列在class文件中的二进制流,中间无任何分隔符;文件开头有一个0xcafebabe(16进制)特殊的一个标志.JVM运行时数据区java程序最终执行是由JVM执行引擎和本地库来做的一些适配,所以在linux和windos上的执行引擎和本地库都会有所不同,目的是为了一次编写,随处运行.如果有想对于JVM有很深入的研究可以看一下C代码,比如openjdk线程独占:每个线程都会有它独立的空间,随线程的生命周期而创

2020-06-01 19:44:00 219

原创 漫谈数据库事务

认识事务事务的概念数据库事务是访问并可能更新数据库 中各种数据项的一个程序执行单元事务的组成一个数据库事务通常包含对数据库进行读或写的一个操作序列典型的数据库事务语句BEGIN TRANSACTIONSQL1SQL2COMMIT/ROLLBACK场景举例有可能出现以下问题转账操作的第一步执行成功,A账户成功扣除100元.但是第二步执行失败或者未执行便发生系统崩溃.导致B账户并没有相应增加100元转账操作刚完成就发生系统崩溃,系统重启恢复时丢失了崩溃前的转账记录

2020-06-01 19:42:38 265

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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