自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ThinkWon的博客

敏于观察,勤于思考,善于综合,勇于创新。

  • 博客(45)
  • 收藏
  • 关注

原创 Spring模块组成(框架组成、整体架构、体系架构、体系结构)

文章目录核心容器AOP 和设备支持数据访问与集成Web消息(Messaging)TestSpring各模块(jar包)之间的依赖关系Spring 总共大约有 20 个模块, 由 1300 多个不同的文件构成。 而这些组件被分别整合在核心容器(Core Container) 、 AOP(Aspect Oriented Programming)和设备支持(Instrmentation) 、数据访问与...

2019-10-29 23:49:56 24956 7

原创 Spring简介、框架核心、优缺点、应用场景

文章目录Spring简介Spring的设计目标Spring的优缺点优点缺点Spring的应用场景Spring简介Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Sprin...

2019-10-29 23:38:43 47091 10

原创 史上最强Tomcat8性能优化

文章目录授人以鱼不如授人以渔目的服务器资源Tomcat配置优化Linux环境安装运行Tomcat8AJP连接执行器(线程池)3种运行模式部署测试用的web项目查看服务器信息部署web应用使用Apache JMeter进行性能测试下载安装修改语言创建接口的测试用例启动与进行接口测试查看测试报告调整Tomcat参数进行优化禁用AJP连接设置线程池最大线程数为150,初始为4最大线程数为500,初始为5...

2019-10-25 15:51:22 59243 83

原创 Linux(CentOS7)安装Tomcat与设置Tomcat为开机启动项

文章目录安装Tomcat下载Tomcat压缩包安装Tomcat启动Tomcat设置Tomcat为开机启动项安装Tomcat下载Tomcat压缩包Tomcat有Tomcat7,Tomcat8和Tomcat9等版本,目前企业使用较多的是Tomcat8,所以这里以Tomcat8为列进入Tomcat8下载网址:Tomcat8下载网址https://tomcat.apache.org/downloa...

2019-10-24 10:27:00 10221 8

转载 Tomcat系统架构与请求处理流程

文章目录Tomcat顶层架构Tomcat顶层架构小结Connector和Container的微妙关系Container架构分析Container如何处理请求的总结面试时问到Tomcat相关问题的几率并不高,正式因为如此,很多人忽略了对Tomcat相关技能的掌握,下面这一篇文章整理了Tomcat相关的系统架构,介绍了Server、Service、Connector、Container之间的关系,各...

2019-10-22 09:30:55 8245 4

原创 Win10安装Tomcat服务器与配置环境变量

文章目录下载安装JDK下载Tomcat压缩包解压Tomcat压缩包Tomcat目录结构启动Tomcat环境变量配置Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。本文主要讲述Windows环境Tomcat服务器安装与环境变量配置下载安装JDK要想安装Tomcat服务...

2019-10-18 11:56:16 34947 18

原创 Tomcat乱码与端口占用的解决方案

文章目录问题一:Tomcat的startup.bat启动后出现乱码问题二:一闪而退之端口占用问题三:非端口问题的一闪而退Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。但是有些小伙伴在启动Tomcat时也会遇到各种各样的问题,比如Tomcat的startup.bat启动...

2019-10-18 11:50:16 9688 4

原创 Tomcat与JDK版本对应关系,Tomcat各版本特性

文章目录Alpha / Beta / StableApache Tomcat 9.xApache Tomcat 8.xApache Tomcat 7.xApache Tomcat 6.xApache Tomcat是一个开源软件实现了Java Servlet和Java Server Pages技术。不同版本的Servlet和JSP规范可使用不同版本的Apache Tomcat。Tomcat与JDK...

2019-10-18 11:45:05 74794 7

原创 Tomcat目录结构

文章目录目录结构bin目录conf目录lib目录webapps目录temp目录Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。十分有必要了解Tomcat目录结构。目录结构解压Tomcat后的目录结构如下图各目录及文件说明目录及文件说明bin...

2019-10-18 09:43:06 19920 16

转载 LinkedHashMap(JDK1.8)源码解析

文章目录概述原理源码分析Entry 的继承体系链表的建立过程链表节点的删除过程访问顺序的维护过程基于 LinkedHashMap 实现缓存总结概述LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题。除此之外,LinkedHashMap 对访问顺序也提供了相关支持。在一些场景下,该...

2019-10-15 20:31:23 7830 5

转载 LinkedList(JDK1.8)源码解析

文章目录概述继承体系源码分析查找遍历插入删除总结概述LinkedList 是 Java 集合框架中一个重要的实现,其底层采用的双向链表结构。和 ArrayList 一样,LinkedList 也支持空值和重复值。由于 LinkedList 基于链表实现,存储元素过程中,无需像 ArrayList 那样进行扩容。但有得必有失,LinkedList 存储元素的节点需要额外的空间存储前驱和后继的引用...

2019-10-15 20:11:01 7438 6

转载 TreeMap(JDK1.8)源码解析

文章目录简介概览源码分析查找遍历插入删除总结简介TreeMap最早出现在JDK 1.2中,是 Java 集合框架中比较重要一个的实现。TreeMap 底层基于红黑树实现,可保证在log(n)时间复杂度内完成 containsKey、get、put 和 remove 操作,效率很高。另一方面,由于 TreeMap 基于红黑树实现,这为 TreeMap 保持键的有序性打下了基础。总的来说,Tree...

2019-10-15 18:35:47 8207 4

转载 红黑树详细分析(图文详解),看了都说好

文章目录红黑树简介红黑树的性质红黑树操作旋转操作插入情况一情况二情况三情况四情况五插入总结删除情况一情况二情况三情况四情况五情况六删除总结总结红黑树简介红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1978年发明,在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Ro...

2019-10-15 17:40:52 28708 23

原创 实现生产者消费者的三种方式

文章目录wait/notify的消息通知机制预备知识wait/notify消息通知潜在的一些问题notify过早通知等待wait的条件发生变化假死状态wait/notifyAll实现生产者-消费者使用Lock中Condition的await/signalAll实现生产者-消费者使用BlockingQueue实现生产者-消费者生产者-消费者模式是一个十分经典的多线程并发协作的模式,弄懂生产者-消费...

2019-10-14 21:25:25 13661 15

原创 并发工具之Semaphore与Exchanger

文章目录控制资源并发访问Semaphore线程间交换数据的工具Exchanger控制资源并发访问SemaphoreSemaphore可以理解为信号量,用于控制资源能够被并发访问的线程数量,以保证多个线程能够合理的使用特定资源。Semaphore就相当于一个许可证,线程需要先通过acquire方法获取该许可证,该线程才能继续往下执行,否则只能在该方法出阻塞等待。当执行完业务功能后,需要通过rel...

2019-10-14 21:18:19 5557 4

原创 并发工具之CountDownLatch与CyclicBarrier

文章目录倒计时器CountDownLatch循环栅栏CyclicBarrierCountDownLatch与CyclicBarrier的比较倒计时器CountDownLatch在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join方法,让主线程等待被join的线程执行完之后,主线程才能继续往下...

2019-10-14 21:15:38 6969 9

原创 原子操作类总结

文章目录原子操作类简介预备知识-CAS操作原子更新基本类型原子更新数组类型原子更新引用类型原子更新字段类型原子操作类简介在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是多线程更新变量i=1,比如多个线程执行i++操作,就有可能获取不到正确的值,而这个问题,最常用的方法是通过Synchronized进行控制来达到线程安全的目的(关于synchronized可以看这篇文章)。但是由于s...

2019-10-14 21:11:56 8383 3

原创 FutureTask详解

文章目录FutureTask简介FutureTask的基本使用FutureTask简介在Executors框架体系中,FutureTask用来表示可获取结果的异步任务。FutureTask实现了Future接口,FutureTask提供了启动和取消异步任务,查询异步任务是否计算结束以及获取最终的异步任务的结果的一些常用的方法。通过get()方法来获取异步任务的结果,但是会阻塞当前线程直至异步任...

2019-10-14 10:02:29 6605 4

原创 线程池之ScheduledThreadPoolExecutor详解

文章目录ScheduledThreadPoolExecutor简介构造方法特有方法可周期性执行的任务-ScheduledFutureTaskDelayedWorkQueueScheduledThreadPoolExecutor执行过程总结ScheduledThreadPoolExecutor简介ScheduledThreadPoolExecutor可以用来在给定延时后执行异步任务或者周期性执行...

2019-10-14 09:58:17 12256 6

原创 Executors类创建四种常见线程池

文章目录线程池架构newSingleThreadExecutornewFixedThreadPoolnewCachedThreadPoolnewScheduledThreadPoolExecutors和ThreaPoolExecutor创建线程池的区别两种提交任务的方法executesubmit线程池架构上图是线程池的架构图。Java里面线程池的顶级接口是Executor,Executor并...

2019-10-14 09:48:26 15205 6

原创 线程池之ThreadPoolExecutor详解

文章目录为什么要使用线程池线程池详解线程池的创建线程池执行逻辑线程池的关闭线程池的工作原理线程池阻塞队列线程池的饱和策略如何合理配置线程池参数?为什么要使用线程池在实际使用中,线程是很占用系统资源的,如果对线程管理不善很容易导致系统问题。因此,在大多数并发框架中都会使用线程池来管理线程,使用线程池管理线程主要有如下好处:降低资源消耗。通过复用已存在的线程和降低线程关闭的次数来尽可能降低系统...

2019-10-14 09:42:10 11294 3

原创 并发容器之ArrayBlockingQueue与LinkedBlockingQueue详解

文章目录ArrayBlockingQueue简介ArrayBlockingQueue实现原理ArrayBlockingQueue的主要属性put方法详解take方法详解LinkedBlockingQueue实现原理LinkedBlockingQueue的主要属性put方法详解take方法详解ArrayBlockingQueue与LinkedBlockingQueue的比较ArrayBlockin...

2019-10-11 19:53:57 8797 3

原创 并发容器之BlockingQueue详解

文章目录BlockingQueue简介基本操作常用的BlockingQueueBlockingQueue简介在实际编程中,会经常使用到JDK中Collection集合框架中的各种容器类如实现List,Map,Queue接口的容器类,但是这些容器类基本上不是线程安全的,除了使用Collections可以将其转换为线程安全的容器,Doug Lea大师为我们都准备了对应的线程安全的容器,如实现Lis...

2019-10-11 19:47:06 7492 4

原创 ThreadLocal内存泄漏分析与解决方案

文章目录造成内存泄漏的原因?已经做出了哪些改进?cleanSomeSlots方法expungeStaleEntry方法replaceStaleEntry方法为什么使用弱引用?Thread.exit()ThreadLocal最佳实践造成内存泄漏的原因?threadLocal是为了解决对象不能被多线程共享访问的问题,通过threadLocal.set方法将对象实例保存在每个线程自己所拥有的thre...

2019-10-11 19:35:23 11942 4

原创 并发容器之ThreadLocal详解

文章目录ThreadLocal的简介ThreadLocal的实现原理ThreadLocalMap详解Entry数据结构set方法getEntry方法remove方法ThreadLocal的使用场景ThreadLocal的简介在多线程编程中通常解决线程安全的问题我们会利用synchronzed或者lock控制线程对临界区资源的同步顺序从而解决线程安全的问题,但是这种加锁的方式会让未获取到锁的线程...

2019-10-11 19:13:20 8362 3

原创 并发容器之CopyOnWriteArrayList详解

文章目录CopyOnWriteArrayList的简介COW的设计思想CopyOnWriteArrayList的实现原理get方法实现原理add方法实现原理总结CopyOnWriteArrayList的简介Java学习者都清楚ArrayList并不是线程安全的,在读线程在读取ArrayList的时候如果有写线程在写数据的时候,基于fast-fail机制,会抛出ConcurrentModific...

2019-10-11 19:04:50 9770 7

原创 并发容器之ConcurrentLinkedQueue详解与源码分析

文章目录ConcurrentLinkedQueue简介Node操作Node的几个CAS操作offer方法poll方法offer方法中部分线程offer部分线程pollHOPS的设计ConcurrentLinkedQueue简介在单线程编程中我们会经常用到一些集合类,比如ArrayList,HashMap等,但是这些类都不是线程安全的类。在面试中也经常会有一些考点,比如ArrayList不是线程...

2019-10-11 18:53:26 6183 4

原创 并发容器之ConcurrentHashMap详解(JDK1.8版本)与源码分析

文章目录ConcurrentHashMap简介关键属性及类重点方法讲解实例构造器方法initTable方法put方法get方法transfer方法与size相关的一些方法总结ConcurrentHashMap简介在使用HashMap时在多线程情况下扩容会出现CPU接近100%的情况,因为hashmap并不是线程安全的,通常我们可以使用在java体系中古老的hashtable类,该类基本上所有的...

2019-10-11 18:38:33 11104 7

原创 LockSupport详解

文章目录LockSupport简介LockSupport方法介绍一个例子LockSupport简介在之前介绍AQS的底层实现,已经在介绍java中的Lock时,比如ReentrantLock,ReentReadWriteLocks,已经在介绍线程间等待/通知机制使用的Condition时都会调用LockSupport.park()方法和LockSupport.unpark()方法。而这个在同步...

2019-10-09 21:13:00 6893 2

原创 Condition源码分析与等待通知机制

文章目录Condition简介Condition实现原理分析等待队列await实现原理signal/signalAll实现原理await与signal/signalAll的结合思考一个例子Condition简介任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long time...

2019-10-09 21:03:52 6881 3

原创 读写锁ReentrantReadWriteLock源码分析

文章目录读写锁的介绍写锁详解写锁的获取写锁的释放读锁详解读锁的获取读锁的释放锁降级读写锁的介绍在并发场景中用于解决线程安全的问题,我们几乎会高频率的使用到独占式锁,通常使用java提供的关键字synchronized(关于synchronized可以看这篇文章)或者concurrents包中实现了Lock接口的ReentrantLock。它们都是独占式获取锁,也就是在同一时刻只有一个线程能够获...

2019-10-09 20:47:26 6205 4

原创 ReentrantLock(重入锁)实现原理与公平锁非公平锁区别

文章目录ReentrantLock的介绍重入性的实现原理公平锁与非公平锁ReentrantLock的介绍ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性(关于synchronized可以看这篇文章),sync...

2019-10-09 20:36:55 9095 3

原创 AQS(AbstractQueuedSynchronizer)详解与源码分析

文章目录AQS简介同步队列独占锁独占锁的获取(acquire方法)独占锁的释放(release()方法)可中断式获取锁(acquireInterruptibly方法)超时等待式获取锁(tryAcquireNanos()方法)共享锁共享锁的获取(acquireShared()方法)共享锁的释放(releaseShared()方法)可中断(acquireSharedInterruptibly()方法)...

2019-10-09 20:24:33 11217 9

原创 Lock简介与初识AQS

文章目录concurrent包的结构层次Lock简介Lock接口API初识AQSAQS的模板方法设计模式一个例子concurrent包的结构层次在针对并发编程中,Doug Lea大师为我们提供了大量实用,高性能的工具类,针对这些代码进行研究会让我们队并发编程的掌握更加透彻也会大大提升我们队并发编程技术的热爱。这些代码在java.util.concurrent包下。如下图,即为concurren...

2019-10-09 20:05:30 12100 7

原创 Java并发关键字-final

文章目录final的简介final的具体使用场景变量final成员变量final局部变量方法类final关键字举例多线程中你真的了解final吗final域重排序规则final域为基本类型final域为引用类型final的实现原理为什么final引用不能从构造函数中“溢出”final的简介final可以修饰变量,方法和类,用于表示所修饰的内容一旦赋值之后就不会再被改变,比如String类就是一...

2019-10-06 18:53:33 8132 4

原创 Java并发关键字-volatile

文章目录volatile简介volatile实现原理volatile的happens-before关系volatile的内存语义volatile的内存语义实现一个示例volatile简介在上一篇文章中我们深入理解了Java关键字-synchronized,我们知道在java中还有一大神器就是关键volatile,可以说是和synchronized各领风骚,其中奥妙,我们来共同探讨下。通过上一...

2019-10-06 18:42:10 10154 8

原创 Java并发关键字-synchronized

文章目录synchronized简介synchronized实现原理对象锁(monitor)机制synchronized的happens-before关系锁获取和锁释放的内存语义synchronized优化CAS操作什么是CAS?CAS的操作过程CAS的应用场景CAS的问题Java对象头偏向锁轻量级锁各种锁的比较一个例子synchronized简介在学习知识前,我们先来看一个现象:publi...

2019-10-06 18:34:01 14686 5

原创 Java并发理论总结

文章目录JMM的设计happens-before与JMM的关系需要关注的问题在多线程中稍微不注意就会出现线程安全问题,那么什么是线程安全问题?为什么会出现线程安全问题?出现线程安全的问题一般是因为主内存和工作内存数据不一致性和重排序导致的,而解决线程安全的问题最重要的就是理解这两种问题是怎么来的,那么,理解它们的核心在于理解Java内存模型(JMM)。为了性能优化,还会涉及到重排序与数据依赖性...

2019-10-04 15:24:27 7940 3

原创 as-if-serial规则和happens-before规则的区别

在上一篇博客中,我们知道为了性能优化,我们学习了重排序与数据依赖性。为了在不改变程序执行结果的前提下,尽可能地提高程序执行的并行度,我们需要了解as-if-serial规则和happens-before规则as-if-serial规则as-if-serial语义的意思指:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。编译器,runtime 和处理器都必须...

2019-10-04 15:19:48 11423 4

原创 重排序与数据依赖性

上一篇博客我们了解了Java内存模型,下面我们来了解一下重排序和数据依赖性的相关知识。为什么需要重排序现在的CPU一般采用流水线来执行指令。一个指令的执行被分成:取指、译码、访存、执行、写回、等若干个阶段。然后,多条指令可以同时存在于流水线中,同时被执行。指令流水线并不是串行的,并不会因为一个耗时很长的指令在“执行”阶段呆很长时间,而导致后续的指令都卡在“执行”之前的阶段上。我们编写的程序都...

2019-10-04 15:15:16 7944 6

空空如也

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

TA关注的人

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