自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 资源 (11)
  • 收藏
  • 关注

原创 java多线程并发系列--基础知识点(笔试、面试必备)

多线程和并发是求职大小厂面试中必问的知识点,其涉及到点很多,难度很大。有些人面对这些问题有点迷茫,为了解决这情况,总结了一下java多线程并发的基础知识点。而且要想深入研究java多线程并发也必须先掌握基础知识,可为后续各个模块深入研究做好做好准备。现在废话不多说,各位看官请查看基础知识点,后续还有源码解析(synchronize底层原理,线程池原理,Lock,AQS,同步、并发容器等源码解析)。...

2019-12-09 23:52:39 1091

原创 《提升能力,涨薪可待》-Java并发之AQS全面详解

一、AQS是什么?有什么用?AQS全称AbstractQueuedSynchronizer,即抽象的队列同步器,是一种用来构建锁和同步器的框架。基于AQS构建同步器:ReentrantLockSemaphoreCountDownLatchReentrantReadWriteLockSynchronusQueueFutureTask优势:AQS 解决了在实现同步器时涉及的大...

2019-12-09 23:49:41 966

原创 《面试知识,工作可待:集合篇》-java集合面试知识大全

一、集合基础1.1 集合框架有哪些优点如下:使用核心集合类降低开发成本,而非实现我们自己的集合类。随着使用经过严格测试的集合框架类,代码质量会得到提高。通过使用 JDK 附带的集合类,可以降低代码维护成本。复用性和可操作性。1.2 Java集合类框架的基本接口有哪些?Java 集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:Col...

2019-12-09 23:47:57 839

原创 MyBatis常见面试题【面试官之你说我听】-

精讲#{}和${}的区别是什么?mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值。mybatis在处理时,就是把{}时,就是把时,就是把{}替换成变量的值。使用#{}可以有效的防止SQL注入,提高系统安全性。原因在于:预编译机制。预编译完成之后,SQL的结构已经固定,即便用户输入非法参数,也不会对SQL的结构产生影响,从...

2019-12-09 23:43:21 913

原创 美团架构师呕心之作:大厂面试核心知识点梳理

1.JVMJVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接 的交互。2. JAVA 集合集合类存放于 Java.util 包中,主要有 3 种:set(集)、list(列表包含 Queue)和 map(映射)。Collection:Collection 是集...

2019-12-09 23:34:23 1250 2

原创 【大厂面试真题350道】性能优化+微服务+并发编程+开源框架+分布式

一,性能优化专题:1.tomcat性能调优怎么给tomcat调优如何加大comcat连接数怎么加大tomcat的内存tomcat中如何禁止列目录下的文件Tomcat有几种部署方式tomcat的优化经验2.jvm性能优化专题:Java类加载过程java内存分配描述一下jvm加载class文件的原理机制GC是什么?为什么要有GC?简述java垃圾回收机制如何判断一个对...

2019-12-09 23:30:15 565

原创 2019年JVM面试都问了什么?快看看这22道面试题!(附答案解析)

一. Java 类加载过程?Java 类加载需要经历一下 7 个过程:1. 加载加载是类加载的第一个过程,在这个阶段,将完成一下三件事情:• 通过一个类的全限定名获取该类的二进制流。• 将该二进制流中的静态存储结构转化为方法去运行时数据结构。• 在内存中生成该类的 Class 对象,作为该类的数据访问入口。2. 验证验证的目的是为了确保 Class 文件的字节流中的信息不回危害到虚...

2019-12-09 23:22:27 698

原创 硬核! 逛了4年Github ,一口气把我收藏的 Java 开源项目分享给你!

Awsome JavaGreat Java project on Github(Github 上非常棒的 Java 开源项目).English Version大家都知道 Github 是一个程序员福地,这里有各种厉害的开源框架、软件或者教程。这些东西对于我们学习和进步有着莫大的进步,所以我有了这个将 Github 上非常棒的 Java 开源项目整理下来的想法。我会按照几个维度对项目进行分类...

2019-12-09 22:35:19 11917

原创 并发编程 (20)并发容器:都有哪些“坑”需要我们填?

ava 并发包有很大一部分内容都是关于并发容器的,因此学习和搞懂这部分的内容很有必要。Java 1.5 之前提供的同步容器虽然也能保证线程安全,但是性能很差,而 Java 1.5 版本之后提供的并发容器在性能方面则做了很多优化,并且容器的类型也更加丰富了。下面我们就对比二者来学习这部分的内容。同步容器及其注意事项Java 中的容器主要可以分为四个大类,分别是 List、Map、Set 和 Q...

2019-12-09 21:44:02 799

原创 并发编程 (19)CountDownLatch和CyclicBarrier:如何让多线程步调一致?

前几天老板突然匆匆忙忙过来,说对账系统最近越来越慢了,能不能快速优化一下。我了解了对账系统的业务后,发现还是挺简单的,用户通过在线商城下单,会生成电子订单,保存在订单库;之后物流会生成派送单给用户发货,派送单保存在派送单库。为了防止漏派送或者重复派送,对账系统每天还会校验是否存在异常订单。对账系统的处理逻辑很简单,你可以参考下面的对账系统流程图。目前对账系统的处理逻辑是首先查询订单,然后查询派送...

2019-12-09 21:32:59 370

原创 并发编程 (18)StampedLock:有没有比读写锁更快的锁?

我们介绍了读写锁,学习完之后你应该已经知道“读写锁允许多个线程同时读共享变量,适用于读多写少的场景”。那在读多写少的场景中,还有没有更快的技术方案呢?还真有,Java 在 1.8 这个版本里,提供了一种叫 StampedLock 的锁,它的性能就比读写锁还要好。下面我们就来介绍一下 StampedLock 的使用方法、内部工作原理以及在使用过程中需要注意的事项。StampedLock 支持的三...

2019-12-09 21:24:10 407

原创 并发编程 (17)ReadWriteLock:如何快速实现一个完备的缓存?

前面我们介绍了管程和信号量这两个同步原语在 Java 语言中的实现,理论上用这两个同步原语中任何一个都可以解决所有的并发问题。那 Java SDK 并发包里为什么还有很多其他的工具类呢?原因很简单:分场景优化性能,提升易用性。今天我们就介绍一种非常普遍的并发场景:读多写少场景。实际工作中,为了优化性能,我们经常会使用缓存,例如缓存元数据、缓存基础数据等,这就是一种典型的读多写少应用场景。缓存之所...

2019-12-09 21:19:53 260

原创 并发编程 (16)Semaphore:如何快速实现一个限流器

Semaphore,现在普遍翻译为“信号量”,以前也曾被翻译成“信号灯”,因为类似现实生活里的红绿灯,车辆能不能通行,要看是不是绿灯。同样,在编程世界里,线程能不能执行,也要看信号量是不是允许。信号量是由大名鼎鼎的计算机科学家迪杰斯特拉(Dijkstra)于 1965 年提出,在这之后的 15 年,信号量一直都是并发编程领域的终结者,直到 1980 年管程被提出来,我们才有了第二选择。目前几乎所...

2019-12-09 21:16:24 734

原创 Netty源码分析-Netty4缓冲区Buffer性能优化之Pooled池化机制

可以先看Netty源码分析-缓冲区Buffer体系结构设计再看这篇分析。性能优化:在对象引用之上的对象池化机制在对象引用的实现中,每当一个Buffer实例没有被引用时,则会销毁该对象实例,如被GC回收,但是Buffer对象创建时的内存分配开销是比较大的,如果频繁创建Buffer对象,频繁进行内存分配释放,则开销较大,影响性能,故在netty4中新增了对象池化机制,即Buffer对象没有被引用...

2019-12-09 14:26:42 277

原创 并发编程 (15)Lock和Condition(下):Dubbo如何用管程实现异步转同步?

在上一篇文章中,我们讲到 Java SDK 并发包里的 Lock 有别于 synchronized 隐式锁的三个特性:能够响应中断、支持超时和非阻塞地获取锁。那今天我们接着再来详细聊聊 Java SDK 并发包里的 Condition,Condition 实现了管程模型里面的条件变量。在《并发编程(9)管程:并发编程的万能钥匙》里我们提到过 Java 语言内置的管程里只有一个条件变量,而 Loc...

2019-12-08 12:57:05 12055

原创 dubbo(10) 简单理解一个dubbo服务的完整调用过程

参考文献dubbo官网-dubbo服务的完整调用过程感受学习业内优秀开源分布式框架的底层rpc实现。调用过程大致可以分为六个阶段,这里只贴出服务调用各个阶段的调用栈进行备忘,详细源码分析请点击原文链接进行阅读1 服务消费方(dubbo-consumer)发布请求调用栈proxy0#sayHello(String) —> InvokerInvocationHandler#invo...

2019-12-08 12:54:28 11136

原创 并发编程 (14)Lock和Condition(上):隐藏在并发包中的管程

Java SDK 并发包内容很丰富,包罗万象,但是我觉得最核心的还是其对管程的实现。因为理论上利用管程,你几乎可以实现并发包里所有的工具类。在前面《并发编程(9)管程:并发编程的万能钥匙》中我们提到过在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之间如何通信、协作。这两大问题,管程都是能够解决的。Java SDK 并发包通过 Lock 和 C...

2019-12-08 12:17:10 11200

原创 并发编程(13)如何用面向对象思想写好并发程序

在工作中,我发现很多同学在设计之初都是直接按照单线程的思路来写程序的,而忽略了本应该重视的并发问题;等上线后的某天,突然发现诡异的 Bug,再历经千辛万苦终于定位到问题所在,却发现对于如何解决已经没有了思路。关于这个问题,我觉得咱们今天很有必要好好聊聊“如何用面向对象思想写好并发程序”这个话题。面向对象思想与并发编程有关系吗?本来是没关系的,它们分属两个不同的领域,但是在 Java 语言里,这...

2019-12-08 11:31:06 12016

原创 并发编程 (12) Java线程(下):为什么局部变量是线程安全的?

我们一遍一遍重复再重复地讲到,多个线程同时访问共享变量的时候,会导致并发问题。那在 Java 语言里,是不是所有变量都是共享变量呢?工作中我发现不少同学会给方法里面的局部变量设置同步,显然这些同学并没有把共享变量搞清楚。那 Java 方法里面的局部变量是否存在并发问题呢?下面我们就先结合一个例子剖析下这个问题。比如,下面代码里的 fibonacci() 这个方法,会根据传入的参数 n ,返回 1...

2019-12-08 11:22:22 10808 1

原创 并发编程(11)Java线程(中):创建多少线程才是合适的?

要解决这个问题,首先要分析以下两个问题:为什么要使用多线程?多线程的应用场景有哪些?为什么要使用多线程?使用多线程,本质上就是提升程序性能。不过此刻谈到的性能,可能在你脑海里还是比较笼统的,基本上就是快、快、快,这种无法度量的感性认识很不科学,所以在提升性能之前,首要问题是:如何度量性能。度量性能的指标有很多,但是有两个指标是最核心的,它们就是延迟和吞吐量。延迟指的是发出请求到收到响...

2019-12-08 11:10:24 12505

原创 告别编码5分钟,命名2小时!史上最全的Java命名规范参考!

简洁清爽的代码风格应该是大多数工程师所期待的。在工作中笔者常常因为起名字而纠结,夸张点可以说是编程5分钟,命名两小时!究竟为什么命名成为了工作中的拦路虎。每个公司都有不同的标准,目的是为了保持统一,减少沟通成本,提升团队研发效能。所以本文中是笔者结合阿里巴巴开发规范,以及工作中的见闻针对Java领域相关命名进行整理和总结,仅供参考。一,Java中的命名规范好的命名能体现出代码的特征,含义或者...

2019-12-07 23:27:14 12389 2

原创 技术面试最后反问面试官的话

预期使用方式检查一下哪些问题你感兴趣检查一下哪些是你可以自己在网上找到答案的找不到的话就向面试官提问绝对不要想把这个列表里的每个问题都问一遍。请记住事情总是灵活的,组织的结构调整也会经常发生。 拥有一个 bug 追踪系统并不会保证高效处理 bug。CI/CD (持续集成系统) 也不一定保证交付时间会很短。职责On-call (电话值班)的计划或者规定是什么?值班或者遇到问题加班...

2019-12-07 23:22:14 10744

原创 并发编程 (10)Java线程(上):Java线程的生命周期

通用的线程生命周期通用的线程生命周期基本上可以用下图这个“五态模型”来描述。这五态分别是:初始状态、可运行状态、运行状态、休眠状态和终止状态。这“五态模型”的详细情况如下所示。初始状态,指的是线程已经被创建,但是还不允许分配 CPU 执行。这个状态属于编程语言特有的,不过这里所谓的被创建,仅仅是在编程语言层面被创建,而在操作系统层面,真正的线程还没有创建。可运行状态,指的是线程可以分配...

2019-12-07 23:13:00 11002

原创 并发编程(9)管程:并发编程的万能钥匙

什么是管程不知道你是否曾思考过这个问题:为什么 Java 在 1.5 之前仅仅提供了 synchronized 关键字及 wait()、notify()、notifyAll() 这三个看似从天而降的方法?在刚接触 Java 的时候,我以为它会提供信号量这种编程原语,因为操作系统原理课程告诉我,用信号量能解决所有并发问题,结果我发现不是。后来我找到了原因:Java 采用的是管程技术,synchro...

2019-12-07 23:05:41 10784

原创 并发编程 (8)安全性、活跃性以及性能问题

通过前面六篇文章,我们开启了一个简单的并发旅程,相信现在你对并发编程需要注意的问题已经有了更深入的理解,这是一个很大的进步,正所谓只有发现问题,才能解决问题。但是前面六篇文章的知识点可能还是有点分散,所以是时候将其总结一下了。并发编程中我们需要注意的问题有很多,很庆幸前人已经帮我们总结过了,主要有三个方面,分别是:安全性问题、活跃性问题和性能问题。下面我就来一一介绍这些问题。安全性问题相信你...

2019-12-07 22:47:41 10790

原创 并发编程 (7)用“等待-通知”机制优化循环等待

由上一篇文章你应该已经知道,在破坏占用且等待条件的时候,如果转出账本和转入账本不满足同时在文件架上这个条件,就用死循环的方式来循环等待,核心代码如下:// 一次性申请转出账户和转入账户,直到成功while(!actr.apply(this, target)) ;如果 apply() 操作耗时非常短,而且并发冲突量也不大时,这个方案还挺不错的,因为这种场景下,循环上几次或者几十次就能一次...

2019-12-07 22:32:01 10733

原创 并发编程 (6)一不小心就死锁了,怎么办?

在上一篇文章中,我们用 Account.class 作为互斥锁,来解决银行业务里面的转账问题,虽然这个方案不存在并发问题,但是所有账户的转账操作都是串行的,例如账户 A 转账户 B、账户 C 转账户 D 这两个转账操作现实世界里是可以并行的,但是在这个方案里却被串行化了,这样的话,性能太差。试想互联网支付盛行的当下,8 亿网民每人每天一笔交易,每天就是 8 亿笔交易;每笔交易都对应着一次转账操作...

2019-12-07 22:21:34 10412

原创 并发编程 (5)互斥锁(下):如何用一把锁保护多个资源?

在上一篇文章中,我们提到受保护资源和锁之间合理的关联关系应该是 N:1 的关系,也就是说可以用一把锁来保护多个资源,但是不能用多把锁来保护一个资源,并且结合文中示例,我们也重点强调了“不能用多把锁来保护一个资源”这个问题。而至于如何保护多个资源,我们今天就来聊聊。保护没有关联关系的多个资源在现实世界里,球场的座位和电影院的座位就是没有关联关系的,这种场景非常容易解决,那就是球赛有球赛的门票,电...

2019-12-07 22:14:29 11883

原创 并发编程 (4)互斥锁(上):解决原子性问题

那原子性问题到底该如何解决呢?你已经知道,原子性问题的源头是线程切换,如果能够禁用线程切换那不就能解决这个问题了吗?而操作系统做线程切换是依赖 CPU 中断的,所以禁止 CPU 发生中断就能够禁止线程切换。在早期单核 CPU 时代,这个方案的确是可行的,而且也有很多应用案例,但是并不适合多核场景。这里我们以 32 位 CPU 上执行 long 型变量的写操作为例来说明这个问题,long 型变量...

2019-12-07 21:59:20 11627

原创 并发编程 (3)Java内存模型:看Java如何解决可见性和有序性问题

什么是 Java 内存模型?你已经知道,导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性、有序性最直接的办法就是禁用缓存和编译优化,但是这样问题虽然解决了,我们程序的性能可就堪忧了。合理的方案应该是按需禁用缓存以及编译优化。那么,如何做到“按需禁用”呢?对于并发程序,何时禁用缓存以及编译优化只有程序员知道,那所谓“按需禁用”其实就是指按照程序员的要求来禁用。所以,为了解决可见性...

2019-12-07 21:21:50 11104

原创 并发编程(2)可见性、原子性和有序性问题:并发编程Bug的源头

并发程序幕后的故事这些年,我们的 CPU、内存、I/O 设备都在不断迭代,不断朝着更快的方向努力。但是,在这个快速发展的过程中,有一个核心矛盾一直存在,就是这三者的速度差异。CPU 和内存的速度差异可以形象地描述为:CPU 是天上一天,内存是地上一年(假设 CPU 执行一条普通指令需要一天,那么 CPU 读写内存得等待一年的时间)。内存和 I/O 设备的速度差异就更大了,内存是天上一天,I/O ...

2019-12-07 21:03:21 10763

原创 并发编程(1)学习攻略如何才能学好并发编程?

并发编程并不是一门相对独立的学科,而是一个综合学科。并发编程相关的概念和技术看上非常零散,相关度也很低,总给你一种这样的感觉:我已经学习很多相关技术了,可还是搞不定并发编程。那如何才能学习好并发编程呢?其实很简单,只要你能从两个方面突破一下就可以了。一个是“跳出来,看全景”,另一个是“钻进去,看本质”。跳出来,看全景我们先说“跳出来”。你应该也知道,学习最忌讳的就是“盲人摸象”,只看到局部,...

2019-12-07 20:46:17 12701 1

原创 总结-推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题(图解版)

《能力提升,加薪可待-JVM篇》-JVM虚拟机(内存、垃圾回收、性能优化)一. JVM内存区域的划分1.1 java虚拟机运行时数据区java虚拟机运行时数据区分布图:JVM栈(Java Virtual Machine Stacks): Java中一个线程就会相应有一个线程栈与之对应,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈,因此栈存储的信息都是跟当前线程(或程序)相关...

2019-12-06 14:35:40 11230

原创 jvm总结

学习JVM的目的也很简单:能够知道JVM是什么,为我们干了什么,具体是怎么干的。能够理解到一些初学时不懂的东西在面试的时候有谈资能装逼一、简单聊聊JVM1.1先来看看简单的Java程序package cn.myframe.demo;public class D5 { public static void main(String[] args) { ...

2019-12-05 09:56:36 11032

window10 redis集群安装所需资源 Redis-x64-3.2.100.zip 、rubyinstaller-2.3.3-x64.exe 、redis

里面包含 Redis-x64-3.2.100.zip 、rubyinstaller-2.3.3-x64.exe 、redis-3.3.3.gem、 redis-trib.rb

2020-07-11

elasticsearch安装文件

安装Elasticsearch 6.3.0和ElasticSearch head插件,百分之99.999成功率

2018-10-18

阿云里redis集群安装远程访问

本人亲自尝试99.99999%的成功率。

2018-08-18

centos6阿里云rabbitmq安装

centos6阿里云rabbitmq安装 ......................................................................................................

2018-04-21

阿里云redis集群公网访问

阿里云redis集群公网访问,百分之百成功率。亲自试验,详细步骤。

2018-04-20

阿里云centos6静默安装oracle11G

阿里云centos6静默安装oracle11G,亲身安装,详细步骤,百分之99.99的成功

2018-04-18

Netty例子含Netty jar

myecplise项目,可直接导入使用。实现netty消息的收发。

2014-06-10

CSS样式API

CHM格式,css样式的最全讲解的API。

2014-06-08

图片自动轮换

jquery +css,图片自动轮换,效果强大,代码简洁,带图片可运行

2014-06-07

图片轮换原码

jquery +css,图片自动轮换,效果强大,代码简洁,带图片可运行

2014-06-07

POI-3.6下载

用于java导出生成excel,excel导出jsp的图片

2014-04-02

空空如也

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

TA关注的人

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