![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
lemonmini
这个作者很懒,什么都没留下…
展开
-
消息中间件的核心作用及能力
1、系统解耦假设你有个系统A,这个系统A会产出一个核心数据,现在下游有系统B和系统C需要这个数据。那简单,系统A就是直接调用系统B和系统C的接口发送数据给他们就好了。整个过程,如下图所示:但是现在要是来了系统D、系统E、系统F、系统G,等等,十来个其他系统慢慢的都需要这份核心数据呢?如下图所示:大家可别以为这是开玩笑,一个大规模系统,往往会拆分为几十个甚至上百个子系统,每个子系统又对应...原创 2019-12-26 21:41:25 · 909 阅读 · 0 评论 -
Java程序员数量即将超过百万?Java还香吗?
数据指出,Java程序语言已经成为世界第一大编程语言。Java源自1995年,在经历了20多年的发展至今,十分受大家欢迎,每年仍有数十万人加入Java开发大潮中来。可以看出,Java很受大众欢迎。我们来了解一下,Java程序员在世界上以及在中国的数量以及程序员占比。来自2014年的数据分析报告显示,2014年全球的软件开发者3数量已经达到1850万人,其中1100万是专业的开发人员,还有750...原创 2019-12-25 17:49:36 · 1292 阅读 · 0 评论 -
如何在Java中使用本地缓存提升Redis
本地缓存是提高Redis等数据库性能的最有用的策略之一。希望在Java中进行本地缓存的Redis开发人员会发现Redis不支持这一功能。在本文中,我们将讨论如何使用第三方redis java客户机利用java和redis中的本地缓存什么是本地缓存?缓存是内存缓冲区,用于将数据存储在一个方便的位置,以便以后对该数据的请求能够更快地执行。在本地缓存中,数据库中最常用的数据在物理上存储在离访问它的...原创 2019-12-20 20:55:33 · 778 阅读 · 0 评论 -
Java深入剖析之JVM
Java运行时数据区:Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图:1、程序计数器:指向当前线程正在执行的字节码指令。线程私有的。2、虚拟机栈:虚拟机栈是Java执行方法...原创 2019-12-16 21:33:48 · 171 阅读 · 0 评论 -
java分析—异常与处理机制
异常机制自定义异常异常机制Throwable类Throwable类是Java异常类型的顶层父类,一个对象只有是 Throwable 类的(直接或者间接)实例,他才是一个异常对象,才能被异常处理机制识别。JDK中内建了一些常用的异常类,我们也可以自定义异常。Throwable又派生出Error类和Exception类。错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能...原创 2019-12-11 20:31:34 · 123 阅读 · 0 评论 -
java实现socket连接方法封装详解
Java实现socket连接技巧Socket通信几乎无时不在, 当然能够搜集到的信息也大量存在, 为了避免重复的劳作, 抽取了关于客户端和服务端的Socket, 并将其应用到适合JVM(LInux/Windows)或者DVM(Android)平台. 这个封装好的API具有以下优势:1.满足具有Socket客户端需求的基本应用。2.满足具有Socket服务端的基本应用。具备并发能力, 能满足...原创 2019-11-21 19:58:53 · 1861 阅读 · 0 评论 -
Netty实战入门详解——让你彻底记住什么是Netty
一、Netty 简介Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API。Netty 的内部实现是很复杂的,但是 Netty 提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty 是完全基于 NIO 实现的,所以整个 Nett...原创 2019-11-20 18:35:56 · 697 阅读 · 0 评论 -
Spring AOP(一) AOP基本概念
Spring框架自诞生之日就拯救我等程序员于水火之中,它有两大法宝,一个是IoC控制反转,另一个便是AOP面向切面编程。今日我们就来破一下它的AOP法宝,以便以后也能自由使出一手AOP大法。AOP全名Aspect-oriented programming面向切面编程大法,它有很多兄弟,分别是经常见的面向对象编程,朴素的面向过程编程和神秘的函数式编程等。所谓AOP的具体解释,以及和OOP的区别不清...原创 2019-11-19 17:09:01 · 143 阅读 · 0 评论 -
java定时任务框架elasticjob详解
前言Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架。去掉了和dd-job中的监控和ddframe接入规范部分。该项目基于成熟的开源产品Quartz和Zookeeper及其客户端Curator进行二次开发。 ddframe其他模块也有可独立开源的部分,之前当当曾开源过dd-soa的基石模块DubboX。 项目开源地址:https://github.co...原创 2019-11-18 21:02:28 · 1879 阅读 · 0 评论 -
redis源码分析—基本数据结构
redis中使用的数据结构有:dict 字典,就是个哈希表,实现和HashMap类似,不做阐述;不同的是在哈希表resize()的时候是分步执行的,后续篇幅再说明。sds 很多项目都对自己的字符串进行了封装,作用类似于leveldb的slice。linkedlist 双端链表,迭代器的实现是通过链表的pre和next实现的,是个BidirctionalIterator。代码中只实现了For...原创 2019-11-15 17:54:03 · 176 阅读 · 0 评论 -
dubbo - 负载均衡调用过程
开篇这篇文章的主要目的是讲清楚ClusterInvoker存在多个invoker对象进行负载均衡的调用过程,也就描述从调用到负载均衡选择的调用链路。【加群】:857565362selector 调用时序图说明:RegistryProtocol的doRefer()方法内部cluster.join()负责创建ClusterInvoker对象,所有的cluster的invoker的选择逻辑...原创 2019-11-07 18:12:10 · 522 阅读 · 0 评论 -
使用 NGINX 做 HTTP 负载均衡
Introduction负载均衡一般被用来优化资源利用率、最大化吞吐量、降低延迟和容错配置。Nginx 可以作为一种十分有效的 HTTP 负载均衡工具来使用,通过 nginx 的负载均衡分发流量到不同的应用服务器,可以提升 web 应用的性能、伸展性和可靠性。【加群】:857565362Load balancing methodsNginx 支持下面几种负载均衡策略:round-rob...原创 2019-11-07 17:28:57 · 139 阅读 · 0 评论 -
Java高级架构之FastDFS分布式文件集群详解
FastDFS简介FastDFS是一款开源的轻量级分布式文件系统,使用C实现,支持Linux、BSD等unix-like操作系统。值得注意的是,fastdfs并不是通用的文件系统,只能通过专用的API访问。fastdfs为互联网应用量身定做,解决了大容量文件存储的问题,fastdfs追求高性能和高扩展性。fastdfs的主要概念:tracker-server:跟踪服务器。用于跟踪文件,主要起...原创 2019-11-06 22:38:23 · 445 阅读 · 0 评论 -
阿里Java架构师浅谈Java微服务架构设计
微服务架构模式(Microservice Architect Pattern)。近两年在服务的疯狂增长与云计算技术的进步,让微服务架构受到重点关注微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API)。每个服务都围绕着具体...原创 2019-11-06 10:27:22 · 378 阅读 · 0 评论 -
单体应用架构和微服务架构的区别
一、单体应用架构概念一个归档包(可以是JAR、WAR、EAR或其它归档格式)包含所有功能的应用程序,通常称为单体应用。而架构单体应用的方法论,就是单体应用架构。二、单体架构示意图三、单体应用架构的优缺点优点便于共享:单个归档文件包含所有功能,便于在团队之间以及不同的部署阶段之间共享。易于测试:单体应用一旦部署,所有的服务或特性就都可以使用了,这简化了测试过程,因为没有额外的依赖,...原创 2019-11-01 19:00:50 · 1345 阅读 · 0 评论 -
业务高可用的保障:异地多活架构
一、什么是异地多活?异地多活:异地指不同地理位置,多活指不同地理位置的系统都是活跃的,都能够提供业务服务。异地多活是为了解决极端场景下所有服务器都出现故障时业务不受影响,或者业务在几分钟内就能够快速恢复而设计的。异地多活的优点:功能强大、提供更好的体验、可以减少业务中断带来的损失异地多活的缺点:代价高昂、设计复杂二、应用场景无法承受异地多活带来的复杂度和成本时可以只做异地备份,不做异地...原创 2019-11-06 11:04:29 · 475 阅读 · 0 评论 -
Spring Cloud原理详解
一、Spring Cloud核心组件:Eureka(1)Netflix Eureka1)Eureka服务端:也称服务注册中心,同其他服务注册中心一样,支持高可用配置。如果Eureka以集群模式部署,当集群中有分片出现故障时,那么Eureka就转入自我保护模式。它允许在分片故障期间继续提供服务的发现和注册,当故障分片恢复运行时,集群中其他分片会把它们的状态再次同步回来2)Eureka客户端:主...原创 2019-10-31 20:46:22 · 980 阅读 · 0 评论 -
springcloud config配置读取优先级过程详解
情景描述最近在修复Eureka的静态页面加载不出的缺陷时,最终发现是远程GIT仓库将静态资源访问方式配置给禁用了(spring.resources.add-mappings=false)。虽然最后直接修改远程GIT仓库的此配置项给解决了(spring.resources.add-mappings=true),但是从中牵涉出的配置读取优先级我们必须好好的再回顾下springcloud confi...原创 2019-10-31 20:36:06 · 4856 阅读 · 0 评论 -
使用SpringBoot整合ssm项目的实例详解
SpringBoot是什么?Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。Spring Boot 现在已经成为 Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。成为 SpringBoot 全家桶,成为一把万能钥匙。SpringBoot的特点1.创建独立的 Spring 应用程序...原创 2019-10-31 20:13:52 · 1423 阅读 · 1 评论 -
MyBatis 动态SQL和缓存机制实例详解
有的时候需要根据要查询的参数动态的拼接SQL语句常用标签:if:字符判断choose【when…otherwise】:分支选择trim【where,set】:字符串截取,其中where标签封装查询条件,set标签封装修改条件foreach:if案例1)在EmployeeMapper接口文件添加一个方法public Student getStudent(Student stude...原创 2019-10-30 18:12:09 · 151 阅读 · 0 评论 -
Java NIO工作原理的全面分析
DK 1.4 中引入的新输入输出 (NIO) 库在标准 Java 代码中提供了高速的、面向块的 I/O。本实用教程从高级概念到底层的编程细节,非常详细地介绍了 NIO 库。您将学到诸如缓冲区和通道这样的关键 I/O 元素的知识,并考察更新后的库中的标准 I/O 是如何工作的。您还将了解只能通过 NIO 来完成的工作,如异步 I/O 和直接缓冲区。◆ 输入/输出:概念性描述I/O 简介I/O...原创 2019-10-18 18:11:39 · 87 阅读 · 0 评论 -
Java 线程池原理深入分析
Java 线程池原理Executor框架的两级调度模型在HotSpot VM的模型中,Java线程被一对一映射为本地操作系统线程。JAVA线程启动时会创建一个本地操作系统线程,当JAVA线程终止时,对应的操作系统线程也被销毁回收,而操作系统会调度所有线程并将它们分配给可用的CPU。在上层,JAVA程序会将应用分解为多个任务,然后使用应用级的调度器(Executor)将这些任务映射成固定数量的...原创 2019-10-17 18:41:40 · 92 阅读 · 0 评论 -
Java并发编程总结——慎用CAS详解
一、CAS和synchronized适用场景1、对于资源竞争较少的情况,使用synchronized同步锁进行线程阻塞和唤醒切换以及用户态内核态间的切换操作额外浪费消耗cpu资源;而CAS基于硬件实现,不需要进入内核,不需要切换线程,操作自旋几率较少,因此可以获得更高的性能。2、对于资源竞争严重的情况,CAS自旋的概率会比较大,从而浪费更多的CPU资源,效率低于synchronized。以ja...原创 2019-10-16 18:31:36 · 147 阅读 · 0 评论 -
Java并发编程之Condition源码分析
Condition介绍ReentrantLock#newCondition()可以创建Condition,在ReentrantLock加锁过程中可以利用Condition阻塞当前线程并临时释放锁,待另外线程获取到锁并在逻辑后通知阻塞线程"激活"。Condition常用在基于异步通信的同步机制实现中,比如dubbo中的请求和获取应答结果的实现。常用方法Condition中主要的方法有2个1)...原创 2019-10-16 17:21:00 · 137 阅读 · 0 评论 -
Java中锁的实现和内存语义浅析
概述锁是Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程获取同一个锁的线程发送消息。锁在实际使用时只是明白锁限制了并发访问, 但是锁是如何实现并发访问的, 同学们可能不太清楚, 下面这篇文章就来揭开锁的神秘面纱.锁的内存语义当线程获取锁时, JMM会把线程对应的本地内存置为无效. 从而使得被监视器保护的临界区的变量必须从主内存中读取.当线程释放锁时,...原创 2019-10-15 19:08:40 · 181 阅读 · 0 评论 -
详谈java指令重排序的问题
指令重排序是个比较复杂、觉得有些不可思议的问题,同样是先以例子开头(建议大家跑下例子,这是实实在在可以重现的,重排序的概率还是挺高的),有个感性的认识/**一个简单的展示Happen-Before的例子.这里有两个共享变量:a和flag,初始值分别为0和false.在ThreadA中先给 a=1,然后flag=true.如果按照有序的话,那么在ThreadB中如果if(flag)成功的话...原创 2019-10-15 18:56:12 · 606 阅读 · 0 评论 -
JAVA面试题合集 JAVA面试题
分布式数据库面试专题系列:分布式通讯面试专题系列:分布式限流面试专题系列:常见算法面试题:开发框架面试题:面试扩充:面试经验:BAT面试常问:性能优化面试题:对标阿里P6级架构师点击链接或扫描二维码获取面试及更多学习资料:...原创 2019-10-15 12:09:15 · 308 阅读 · 0 评论 -
Java并发系列之ReentrantLock源码分析
在Java5.0之前,协调对共享对象的访问可以使用的机制只有synchronized和volatile。我们知道synchronized关键字实现了内置锁,而volatile关键字保证了多线程的内存可见性。在大多数情况下,这些机制都能很好地完成工作,但却无法实现一些更高级的功能,例如,无法中断一个正在等待获取锁的线程,无法实现限定时间的获取锁机制,无法实现非阻塞结构的加锁规则等。而这些更灵活的加锁...原创 2019-10-14 18:31:32 · 82 阅读 · 0 评论 -
详细分析Java并发集合LinkedBlockingQueue的用法
数组的长度在创建时就必须确定,如果数组长度小了,那么ArrayBlockingQueue队列很容易就被阻塞,如果数组长度大了,就容易浪费内存。而队列这个数据结构天然适合用链表这个形式,而LinkedBlockingQueue就是使用链表方式实现的阻塞队列。一、链表实现1.1 Node内部类/** * 链表的节点,同时也是通过它来实现一个单向链表 */ static class Nod...原创 2019-10-14 18:00:48 · 359 阅读 · 1 评论 -
Java使用Condition控制线程通信的方法实例详解
本文实例讲述了Java使用Condition控制线程通信的方法。分享给大家供大家参考,具体如下:一、前言当使用Lock对象来保证同步时,Java提供了一个Condition类来保持协调,使用Condition可以让那些已经得到Lock对象、却无法继续执行的线程释放Lock对象,Condtion对象也可以唤醒其他处于等待的线程。Condition 将同步监视锁方法(wait、notify 和 ...原创 2019-10-12 17:19:54 · 120 阅读 · 0 评论 -
深入解析Java的线程同步以及线程间通信
Java线程同步当两个或两个以上的线程需要共享资源,它们需要某种方法来确定资源在某一刻仅被一个线程占用。达到此目的的过程叫做同步(synchronization)。像你所看到的,Java为此提供了独特的,语言水平上的支持。同步的关键是管程(也叫信号量semaphore)的概念。管程是一个互斥独占锁定的对象,或称互斥体(mutex)。在给定的时间,仅有一个线程可以获得管程。当一个线程需要锁定,它...原创 2019-10-12 16:47:51 · 320 阅读 · 0 评论 -
Java中级工程师面试题
String、StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?String是字符串常量,StringBuffer和StringBuilder是字符串变量。StringBuffer是线程安全的,StringBuilder是非线程安全的。具体来说String是一个不可变的对象,每次修改String对象实际上是创新新对象,并将引用指向新对象。效率很低。...原创 2019-09-24 16:52:15 · 2009 阅读 · 0 评论 -
JVM中GC详解
在Java面试过程中,JVM是必问项目。主要问题一般都是集中到JVM GC的类型和策略上。今天主要谈到的是年轻代GC、老年代GC以及Minor GC、Major GC、Full GC之间的联系与区别。JVM堆内存分为两部分:年轻代(Young Generation)和老年代(Old Generation)。年轻代:产生新对象。年轻代被分为3个部分:一个Eden区和两个Survivor区...原创 2019-09-24 13:44:10 · 315 阅读 · 0 评论 -
面试必知Redis
使用Redis有哪些好处?速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O支持丰富数据类型,支持string,list,set,sorted set,hash支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除redis相比m...原创 2019-09-23 17:54:51 · 92 阅读 · 0 评论 -
为何我建议1-3年的Java程序员看看这篇文章
金九银十的跳槽面试季即将到来,最近跟朋友在一起聚会的时候,提了一个问题,说1-3年的Java程序员,薪资区间大致是在15-25K左右,那有没有可能提前达到30K的薪资呢?有人说这只能是大企业或者互联网企业工程师才能拿到。也许是的,小公司或者非互联网企业拿30K的不太可能是初级开发或者码农了,应该已经转管理。还有区域问题,这个是不在我的考虑范围内 因为除了北上广深杭,其他地方也很难达到。首先:30...原创 2019-09-20 16:20:43 · 1813 阅读 · 0 评论 -
BAT面试总结(四)
java反射的作用于原理什么是Java的反射呢?Java 反射是可以让我们在运行时,通过一个类的Class对象来获取它获取类的方法、属性、父类、接口等类的内部信息的机制。这种动态获取信息以及动态调用对象的方法的功能称为JAVA的反射。反射的作用?反射就是:在任意一个方法里:1)如果我知道一个类的名称/或者它的一个实例对象, 我就能把这个类的所有方法和变量的信息找出来(方法名,变量名...原创 2019-09-19 13:25:05 · 147 阅读 · 0 评论 -
BAT面试总结(三)
21. TreeMap、HashMap、LindedHashMap的区别LinkedHashMap可以保证HashMap集合有序,存入的顺序和取出的顺序一致。TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。HashMap不保证顺序,即为无序的,具有很快的访问速...原创 2019-09-18 17:09:47 · 147 阅读 · 0 评论 -
Java面试宝典(2)
有没有遇到过内存溢出,内存溢出怎么解决?分不同情况解决,大多数情况下,此时如果代码没有问题的情况下,适当调整-Xmx和-Xms是可以避免的,不过一定是代码没有问题的前提,为什么会溢出呢,要么代码有问题,要么访问量太多并且每个访问的时间太长或者数据太多,导致数据释放不掉,因为垃圾回收器是要找到那些是垃圾才能回收,这里它不会认为这些东西是垃圾,自然不会去回收了。jvm调优有哪几种方式观察内...原创 2019-09-18 13:09:00 · 90 阅读 · 0 评论 -
Java面试宝典(1)
JAVA中能创建volatile数组吗?volatile能使得一个非原子操作变成原子操作吗?可以,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组。Java 中读取 long 类型变量不是原子的,需要分成两步,如果一个线程正在修改该 long 变量的值,另一个线程可能只能看到该值的一半(前 32 位)。但是volatile 型的 long 或 do...原创 2019-09-18 11:55:10 · 112 阅读 · 0 评论 -
Spring面试专题(2)
依赖注入什么是Spring的依赖注入?注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。有哪些不同类型的IOC(依赖注入)方式?构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一...原创 2019-09-17 16:28:19 · 90 阅读 · 0 评论