能力说明:
精通JVM运行机制,包括类生命、内存模型、垃圾回收及JVM常见参数;能够熟练使用Runnable接口创建线程和使用ExecutorService并发执行任务、识别潜在的死锁线程问题;能够使用Synchronized关键字和atomic包控制线程的执行顺序,使用并行Fork/Join框架;能过开发使用原始版本函数式接口的代码。
能力说明:
熟悉微服务常用开放框架,理解Spring、Spring Boot,以及Spring Cloud的概念和不同,对Spring Cloud Alibaba有较为全面的认知。对Istio具备基础运维能力,掌握基本组件的知识。
能力说明:
掌握Java开发环境下所需的MySQL高级技巧,包括索引策略、innodb和myisam存储引擎,熟悉MySQL锁机制,能熟练配置MySQL主从复制,熟练掌握日常SQL诊断和性能分析工具和策略。可对云数据库进行备份恢复与监控、安全策略的设置,并可对云数据库进行性能优化。掌握主要NOSQL数据库的应用技术。
互联网一线农民工。
我们都知道AppleWatch支持了解锁Mac的功能,如果您的 Mac(2013 年中或后续机型)安装了macOS Sierra(Apple Watch Series 1 和 Apple Watch Series 2)、macOS High Sierra 或更高版本(Apple Watch Series 3 或后续机型),那么当其从睡眠模式唤醒时,Apple Watch 会立即解锁您的 Mac。
Warning: the fonts "Times" and "Lucida Bright" are not available for the Java logical font "Serif", which may have unexpected appearance or behavior. Re-enable the "Times" font to remove this warning.
桥接模式是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。
适配器模式是一种结构型设计模式, 它能将接口转换为客户期望的另一个接口,也就是说它能使接口不兼容的对象能够相互合作。
原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。
建造者模式也叫"生成器模式",它也是是一种创建型设计模式,它能使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。
工厂模式(Factory Pattern)是Java中最常用的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种创建对象的绝佳方式。
工厂模式(Factory Pattern)是Java中最常用的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种创建对象的绝佳方式。
工厂模式(Factory Pattern)是Java中最常用的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种创建对象的绝佳方式。
上文我们了解常见的单例模式的创建方式,但还有没有其他的方式呢?在日常开发中推荐使用哪种呢?本文将带你深入了解其他的单例创建方式,以及单例模式的破坏。
单例模式是Java中最简单的设计模式了,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。
设计模式是众多软件开发人员经过长时间的试错和应用总结出来的,解决特定问题的一系列方案。它同样也是程序员在设计应用程序或系统时可以用来解决常见问题的最佳形式化实践。 设计模式可以通过提供经过测试的、经过验证的开发范例来加速开发过程。
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。它功能很强大,它能在运行时做很多操作,例如:判断任意一个对象所属的类、运行时构造任意一个类的对象、调用任意一个对象的方法、动态代理生成等等。
Constructor类是Java反射中重要的类,它是对类中构造器的描述的类。类似于Method(对类中方法的描述的类),Field(对类中属性的描述的类),我们通过创建Constructor的对象实例,就可以创建源对象。
日常开发中,我们可使用反射获取JavaBean的方法信息,而描述属性信息的就是Java Method,Method类同样位于java.lang.reflect包下。
日常开发中,我们可使用反射获取JavaBean的属性信息,而描述属性信息的就是Java Field,Field类位于java.lang.reflect包下。
前几篇文章讲述Java反射核心功能与用法,基本的常用方法都已经囊括里面了,本篇针是对前几篇文章进行补充。
我们在日常开发中,json几乎随处可见,但是繁琐的json,也给我们解析带来了很多烦恼的问题,多层级的解析,以及各种嵌套对象的解析,那有没有一种更简单的解析方式呢?
在日常开发中,限流是高并发系统的三把守护利器之一,它的另外两个好兄弟缓存、降级下次再说。而限流在绝大多数场景中用来限制并发和请求量,像秒杀之类的高流量业务的场景,都能见到它的身影,所以它就是保护系统和下游的业务系统不被流量冲垮的利器。
我们上篇文章讲述了Joiner相关API使用,其中提到了Splitter,它与Joiner操作相反,它是根据给定的分隔符,把一个字符串分隔成若个子字符串,那么本篇我们来看看Splitter都有哪些操作的方式。
日常开发中,我们经常需要将几个字符串,或者字符串数组、列表之类的数据,拼接成一个以指定符号分隔各个元素的字符串,比如把[1, 2, 3]拼接成"1-2-3",如果自己实现的话,基本上就需要编写循环去实现这个功能,代码就变得晦涩起来。
日常开发中,使用最多的就是集合了,所以避免不了对集合的各种操作,本篇文章来看一下,Guava中都有哪些常用的集合操作的API可以简化我们的代码。
由人工智能实验室OpenAI发布的对话式大型语言模型ChatGPT最近刷遍朋友圈。它可以轻松与人类进行各个领域的对话,回答各种问题,无论是写代码改bug、回答科学问题,甚至给推特的发展提建议。如果还没体验过,你可以去跟它聊聊。
在日常开发中,我们经常去比较两个对象是否相等,如果此对象是josn反序列化的,那么还要对对象属性进行逐一比对,手写个工具类耗时耗力,那如何解决此类问题呢。
在日常开发中,会有些字段经常发生变化的类,但是每次都要修改数据传输类,例如前端需要额外新增一个 参数响应,或者业务上需要调整某些动态的字段等等,那如何解决此类问题呢。
在日常开发中,NPE异常是导致应用程序失败的最常见原因。为了解决空指针异常,Google公司知名的 Guava项目引入了Optional类,它通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。
我们知道使用Callable可以获得线程中的返回值,它在 java.util.concurrent 包中声明。此接口还包含一个单一的、无参数的cal方法,此方法与Runnable接口的run方法类似,只是它可以返回一个值,并且可以抛出一个已检查的异常。事实上Callable也是Runnable,因为这两个接口都指定了一个有可能被另一个线程执行的类,只是它不受Runnable的限制。
Aliyun-RocketMQ 入门拾遗。
如果在线上排查问题的时候,想获取某个类中的ThreadLocal静态对象的值、静态字段的值,如何获取呢?
在使用Arthas排查线上问题的时候,有些时候我们需要查看某些类有没有被加载,或者这个类的静态成员变量到底有没有被打包,又或者需要load测试一下是否正常,那么这个时候可以通过本文进行相关的操作了。
在使用Arthas排查线上问题的时候,有些时候我们需要查看某些Sql的生成,如果线上没有完备的APM的话,那么如何临时查看呢,前几篇文章我们分析了Mybatis的插件机制,如果你还记得的话,我们可以通过watch这个插件进行查看。
日常开发中,我们经常会对某些业务代码进行日志埋点,但是在查找某些故障的时候,如果想不停机的动态更改logger的日志级别,有没有简单的一种方式?比如我只想更改我指定类的日志级别。
是否在本地使用Arthas的时候,遇到The telnet port 3658 is used by process 34725 instead of target process 44848, you will connect to an unexpected process的异常,其实解决方法很简单。
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
正则表达式(Regular Expression),通常被用来检索、替换那些符合某个规则的文本数据。在众多计算机语言中基本都支持正则表达式,如PHP、Java、Python等。在Java中可以通过处理字符串的方式达到检索,替换文本字符串的目的,正则表达式可以在书写代码的时候可以更加简洁,如果你熟悉正则表达式,通常几行代码就可以搞定相当复杂的字符串处理方式。
随着我们业务量的增长,系统面对的压力也陡然上升,大量的读写请求到数据库往往会伴随着各式各样的问题,可能仅仅是一条慢SQL,就有可能拖垮整个系统服务。通常这个时候,我们除了做数据库的读写分离架构,还会对数据库进行分库分表。但是可能有些一成不变或者极少时间触发变更的数据,像类目、类目属性等,大量的针对类目维度的读数据库也会给数据库带来各种压力,通常会以NoSql数据库与关系型数据库互相搭配的方式,以用来更好的服务与我们的业务发展。
咱就说有没有一种可能,同步、异步、阻塞、非阻塞,这几个关键词拆开看都感觉挺明白的。但是同步阻塞、同步非阻塞、异步阻塞、异步非阻塞,这几个关键词组装起来,看起来就有点那么晦涩了。这个在日常八股中经常出现字眼,其背后对应的到底是个什么样的逻辑?我们来一起揭开它那不那么神秘的面纱。/手动狗头。
日常开发中或者代码优化过程中,一定会遇到不少的if语句,如果判断逻辑多了,会导致代码极其冗余,阅读性也会大打折扣,"消灭"if语句的方式有很多,也分不同的场景,本文将使用枚举策略的方式优化繁琐的if语句,你可以参考下文。
在日常开发中,或多或少的都遇到过顺序消息的使用场景,那么为什么要使用顺序消息呢?如果不使用顺序消息会有什么问题吗?市面上的消息中间件又是如何实现的呢?
上文我们详细了解了类加载以及什么是双亲委派机制,相信很多童鞋都了解Tomcat打破了双亲委派机制,本文将对Tomcat为什么要打破双亲委派机制,以及Tomcat是如何打破双亲委派机制的,进行完整性的复盘与解析。
我们在SpringBoot框架中,经常会看到spring.factories文件,里面写了自动配置相关的类名。但是往往我们在项目中使用配置类都是使用@Configuration注解,那么为什么还需要spring.factories文件?它的作用又是什么呢?
MAT是基于Eclipse的内存分析工具,MAT(Memory Analyer Tool),它是一个快速、功能丰富的Java Heap的分析工具,它可以帮助我们查找内存泄漏和排查问题,而且还有丰富的报表统计等等。我们可以通过插件的形式运行还可以单独下载,在前文中我们介绍了如何安装MAT工具,详情可以翻阅查看。
上回书说道,我们在java.lang.ClassLoader中的loadClass方法中看到有类加载相关的并发控制,那么它到底是为了解决什么样的问题,以及它是如何使用的呢?
从上文我们分析了类加载器的过程与定义,我们从中得知,在JVM类加载器中有三大特性,其中缓存机制有效的保证了在同一个类加载器实例下,相同全名的类只加载一次,即loadClass方法不会被重复调用。我们这个小节就来看看它是如何利用缓存机制的已经它的流程是如何的。
如果跟同事谈“双亲委派”,难免显得很八股了,但是这个“双亲委派”却是JVM在类加载环节必不可少的一个操作,充分的理解它,能够使我们更加良好的理解JVM在加载类的时候背后细节。不仅如此,在学习了解一些其他的技术,例如:SPI、OSGI等等,也能相辅相成,融会贯通,可谓“两仪生四象,四象生八卦”
在日常的开发中,相信你一定使用过Lombok,它是一款开源的可用于Java平台的代码生成库。我们在定义JavaBean的时候,会使用IDE自动生成构造方法、getter、setter、equals、hashCode、toString等方法,一旦类的属性有修改就要重新生成,通过使用Lambok的简单注解来精简代码就能达到消除冗长代码的目的。
我们在日常的多线程编程中,为了充分的利用现在计算机多核的CPU资源,通常是需要开启多个线程来执行相对应的异步任务。在Java中,如果想新建一个线程,就必须要实现Runnable接口或者继承Thread。但是无论这两种方式如何实现,我们都无法获取任务执行的返回结果,那么有没有一种方式是可以获取异步线程返回的结果呢?
在Java语言中,Object作为顶级的父类中有一个wait()方法,我们都知道wait()跟notify()作为Java中的线程通信机制,但是你有没有想过:为什么wait方法是在Object中?它为什么不是在Thread中?
Spring MVC框架使用了其”模型-视图-控制器”( Model-View-Controller )架构方式,用于开发灵活且松散耦合的 Web 应用程序。我们都使用过SpringMVC来处理信息,并渲染视图到Browser。但需要注意的是,在现在的架构中,大都采用了前后端分离的情况,而我们在使用SpringMVC的时候,只需要关注M(Model),C(Controller)这两个部分,而视图渲染的部分则交给了前端。
作为开发者的你,平时肯定会有很多自己的笔记,记录着许多工作问题、学习记录等等。近年来有很多支持在线编辑的平台,例如wolai、语雀等等,它们或多或少的都支持在线的markdown的编辑,也支持导入导出等丰富功能。但是对笔者来说,这些平台虽然功能繁多,但因个人习惯不同,笔者还是习惯了Typora的简约的风格,也便于持久化存放、不会因为网络等问题访问不了笔记等原因。在实际使用的过程中,会遇到在笔记中图片上传的问题,在发布到其他平台的时候由于都是本地图片,还需要上传一次,这个时候图床就派上用场了。