大家好,又见面了,我是你们的朋友全栈君。 在 Java 语言中,并发编程往往都是通过床架线程池来实现的,而线程池的创建方式也有很多种,每种线程池的创建方式都对应了不同的使用场景。...总结来说线程池的创建可以分为两大类: 通过 Executors 创建 通过 ThreadPoolExecutor 创建 以上这两类创建线程池的方式有 7 种具体实现方法,这 7 种方法便是本文要说的创建线程池的七种方式...() 创建一个可缓存的线程池,若线程数超过处理所需,缓存一段时间后会回收,若线程数不够,则新建线程 Executors.newSingleThreadExecutor() 创建单个线程的线程池,可以保证先进先出的执行顺序...Executors.newWorkStealingPool() 创建一个抢占式执行的线程池 ThreadPoolExecutor() 手动创建线程池,可自定义相关参数 Executors.newFixedThreadPool...2 个线程的线程池,执行 8 个任务,执行结果为: Executors.newCachedThreadPool():创建一个可缓存的线程池,若线程数超过人物所需,那么多余的线程会被缓存一段时间后再回收
JVM 虚拟机中是如何创建的,在什么地方分配内存,又是如何分配的,对象是如何定位的,以及对象的内存布局,最后又是如何回收的。...只有在线程的 TLAB 用完才会去堆中进行内存分配,此时才需要同步机制。如下图所示: 3)对象的访问定位 句柄访问,见下图所示: 注:句柄池是 Java 堆分配用于存放对象指针的内存空间。...直接访问,见下图所示: 优点:相对于句柄访问定位的方式,减少了一次指针定位的开销(也减少了句柄池的存储空间),HotSpot JVM 实现采用的是直接访问的方式进行对象访问定位。...其他区域都是线程私有的,即随着线程的创建而创建,随着线程的销毁而销毁。...输出时间戳 -XX:+PrintGCDateStamps # GC日志输出指定文件中 -Xloggc:/log/gc.log 小结 从 Java 代码如何运行的,聊到 JVM 内存布局,虚拟机参数的配置说明
热点问题-业务层 在业务层接口IQuestionService中添加抽象方法: /** * 查询点击数量最多的问题的列表,将从缓存中获取列表,如果缓存中没有数据,会从数据库中查询数据并更新缓存 *...当以上4个条件全部满足时,就需要考虑如何解决线程安全问题了!...尽量不要将数据声明为全局的属性,可能导致线程安全问题,例如:在某Service实现类中声明了全局属性,由于Spring是使用单例模式管理对象的,所以,在整个项目运行期间,该Service类的对象只会存在...1个,则类中的全局属性也只有1个,若干个线程访问时,用到的都是同一个全局属性,就可能存在线程安全问题!...所以,能不声明为全局变量就不要声明为全局变量,如果一定需要使用,需要评估该全局变量是否可能存在修改,例如在Service中装配的持久层对象就不会被修改,只是用于调用方法的,就不存在线程安全问题,如果是List
和写入一样,ES 的任意节点可以作为查询请求的协调节点,请求转发至对应一个或多个(取决于路由规则,不指定路由默认索引所有分片均查询)数据分片的主或者从分片进行查询,查询根据复杂度分不同类型,QUERY_THEN_FETCH...持久化的内容包含两部分,索引元数据和集群元数据也叫全局元数据,下面我们分别来介绍这两部分持久化的内容。...5.2.2 全局元数据(global metadata) 全局元数据持久化的内容主要是前面描述的 MetaData 对象中去除 indices 索引部分。...下半部分就是我们上面描述的全局元数据持久化的文件。 ...前面我们从内存、持久化层面介绍了 ES 元数据的组成部分,接下来我们看看 ES 是如何对元数据进行管理的。
答:所谓"持久"就是将数据保存到可掉电式存储设备中以便今后使用,简单的说,就是将内存中的数据保存到关系型数据库、文件系统、消息队列等提供持久化支持的设备中。...merge()方法可以完成save()和update()方法的功能,它的意图是将新的状态合并到已有的持久化对象上或创建新的持久化对象。...游离态:当Session进行了close()、clear()、evict()或flush()后,实体对象从持久态变成游离态,对象虽然拥有持久和与数据库对应记录一致的标识值,但是因为对象已经从会话中清除掉...所谓的"控制反转"就是对组件对象控制权的转移,从程序代码本身转移到了外部容器,由容器来创建对象并管理对象之间的依赖关系。...在方法内部创建对象,这样对象由进入方法的线程创建,不会出现多个线程访问同一对象的问题。使用ThreadLocal将对象与线程`绑定`也是很好的做法,这一点在前面已经探讨过了。 C.
比 如,可以执行多个独立的查询,构建出一个用户对象(user object),然后将 用户对象缓存到 memcached 中。而 query cache 是 SQL 语句级别的,不可能 做到这一点。...在失效节点被恢复或替换之前,还有很多其他节点可以应对节 点失效带来的影响。 • 把失效的节点从节点列表中移除。做这个操作千万要小心!...如果您希望限制访问 ,您 可以使用防火墙 ,或 者让 memcached 监听 unix domain socket。 15、memcached 的多线程是什么?如何使用它们?...简单地总结一下:命令解析( memcached 在这里花了大部分时间 )可以运行在多 线程模式下 。memcached 内部对数据的操作是基于很多全局锁 的( 因此这部分工 作不是多线程的)。...而 memcache 只支持简单数据类型 ,需要客户端自己处理复 杂对象 2、 Redis 支持数据的持久化, 可以将内存中的数据保持在磁盘中, 重启的时候可 以再次加载进行使用( PS: 持久化在 rdb
堆区包含了Java应用创建的所有对象信息,不管对象是哪个线程创建的,其中的对象包括原始类型的封装类(如Byte、Integer、Long等等)。...左边CPU中运行的线程从主存中拷贝共享对象obj到它的CPU缓存,把对象obj的count变量改为2。...但是现在,由于项目的需要,我们的DAO在访问sessionFactory的时候都不得不在多个数据源中不断切换,问题就出现了:如何让sessionFactory在执行数据持久化的时候,根据客户的需求能够动态切换不同的数据源...10.6单例模式(Singleton) 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。...如果为 -1, 表示不限制建立客户连接的时间 17 数据库访问量很大时如何做优化 如果有一个特别大的访问量到数据库上时,往往查询速度会变得很慢,所以我们需要进行优化。
比如,可以执行多个独立的查询,构建出一个用户对象(user object),然后将用户对象缓存到 memcached 中。而query cache 是SQL 语句级别的,不可能做到这一点。...在失效节点被恢复或替换之前,还有很多其他节点可以应对节点失效带来的影响。 把失效的节点从节点列表中移除。做这个操作千万要小心!...简单地总结一下: 命令解析( memcached 在这里花了大部分时间)可以运行在多线程模式下。memcached 内部对数据的操作是基于很多全局锁的( 因此这部分工作不是多线程的) 。...未来对多线程模式的改进, 将移除大量的全局锁, 提高memcached 在负载极高的场景下的性能。 16、memcached 能接受的key 的最大长度是多少? ...而 memcache 只支持简单数据类型,需要客户端自己处理复杂对象 2、Redis 支持数据的持久化, 可以将内存中的数据保持在磁盘中, 重启的时候可以再次加载进行使用( PS: 持久化在 rdb、
7、请说说 Redis 的线程模型? 8、为什么 Redis 单线程模型也能效率这么高? 9、Redis 是单线程的,如何提高多核 CPU 的利用率? 10、Redis 的同步机制了解是什么?...如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。...最新列表 Redis列表结构,LPUSH可以在列表头部插入一个内容ID作为关键字,LTRIM可用来限制列表的数量,这样列表永远为N个ID,无需查询最新的列表,直接根据ID去到对应的内容页即可。...这就会导致,Jedis 读会访问到从节点,导致问题。当然,Redisson 库的功能比较强大,已经支持从节点的故障监听。...缓存空对象 如果从数据库查询的结果为空,依然把这个结果进行缓存,那么当用 key 获取数据时,即使数据不存在,Redis 也可以直接返回结果,避免多次访问数据库。
就是由代理创建出一个和 impl 实现类平级的一个对象,但是这个对象不是一个真正的对象,只是一个代理对象,但它可以实现和 impl 相同的功能,这个就是 aop 的横向机制原理,这样就不需要修改源代码。...缓存击穿 问题:某个 KEY 失效的时候,正好有大量并发请求访问这个 KEY。 分析:跟穿透其实很像,属于比较偶然的。 解决办法:KEY 的更新操作添加全局互斥锁。...做好主从的部署,当主节点挂掉后,能快速的使用从结点顶上。实现熔断限流机制,对系统进行负载能力控制。对于非核心功能的业务,拒绝其请求,只允许核心功能业务访问数据库获取数据。...参数如何设置? 堆内存是指由程序代码自由分配的内存,与栈内存作区分。 在 Java 中,堆内存主要用于分配对象的存储空间,只要拿到对象引用,所有线程都可以访问堆内存。 -Xmx, 指定最大堆内存。...redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
创建线程有哪几种方式 继承Thread类创建线程 定义Thread类的子类,重写该类的run方法,该run方法的方法体就代表了线程要完成的任务 创建Thread子类的实例,即创建了线程对象 调用线程对象的...,并依次实例做为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象 调用线程对象的start方法启动该线程 通过Callable和Future方法创建线程 38....session是一个存在服务器上的类似于一个散列表格的文件。里面存有我们需要的信息,在我们需要用的时候可以从里面取出来。...当然,从 RabbitMQ 的全局角度,vhost 可以作为不同权限隔离的手段 113**. rabbitmq 的消息是怎么发送的?...使用 explain 命令查询 SQL 语句执行计划。 开启慢查询日志,查看慢查询的 SQL。 151.如何做 mysql 的性能优化? 为搜索字段创建索引。
为什么要用Hibernate 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。...查询不到抛异常 11. hibernate的三种状态之间如何转换 当对象由瞬时状态(Transient)一save()时,就变成了持久化状态; Session 一 Close()了,它的缓存也都关闭了...select : 默认select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询; subselece : 子查询...作为一个单个的数据存储,它也是线程安全的,所以多个线程可同时使用同一个SessionFactory,hibernate中的配置文件,映射文件,持久化类的信息都保存在SessionFactory。...接口:负责保存、更新、删除、加载和查询对象,是线程不安全的, Transaction 接口:管理事务; Query 和Criteria 接口:执行数据库的查询。
在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。辅助索引叶子节点存储的不再是行的物理位置,而是主键值。 3)从“索引字段特性角度”分类 主键索引。...在文本类型如CHAR、VARCHAR、TEXT类列上创建索引时,可以指定索引列的长度,但是数值类型不能指定。 4)从“组成索引的字段个数角度”分类 单列索引。...newFixedThreadPool:创建固定大小的线程池,每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。...newCachedThreadPool:创建一个可缓存的线程池,此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。...设置持久化有两个步骤:创建queue的时候将其设置为持久化,这样就可以保证RabbitMQ持久化queue的元数据,但是不会持久化queue里的数据。
hibernate的三种状态之间如何转换 hibernate的三种状态之间如何转换 Hibernate中对象的状态: 临时/瞬时状态 持久化状态 游离状态 临时/瞬时状态 当我们直接new出来的对象就是临时...、insert、update:直接传入一个对象 select:直接返回一个对象 在数据库中条件查询速度很慢的时候,如何优化?...什么是SessionFactory,她是线程安全么 SessionFactory 是Hibrenate单例数据存储和线程安全的,以至于可以多线程同时访问。...merge的含义: merge的含义: 如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象的状态覆盖旧有的持久实例 如果session没有相应的持久实例,则尝试从数据库中加载...,或创建新的持久化实例,最后返回该持久实例 用户给出的这个对象没有被关联到session上,它依旧是脱管的 详情可参考: http://cp3.iteye.com/blog/786019 persist
答:SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,可以被多个线程并发访问。SessionFactory一般只会在启动的时候构建。...对于应用程序,最好将SessionFactory通过单例的模式进行封装以便于访问。Session是一个轻量级非线程安全的对象(线程间不能共享session),它表示与数据库进行交互的一个工作单元。...merge方法可以完成save()和update()方法的功能,它的意图是将新的状态合并到已有的持久化对象上或创建新的持久化对象。...游离状态的对象与临时状态对象是十分相似的,只是它还含有持久化标识。 111、如何理解Hibernate的延迟加载机制。在实际应用中,延迟加载与session关闭的矛盾是如何处理的?...通过一级缓存,可以减少程序与数据库的交互,从而提高数据库访问性能。 SessionFactory级别的二级缓存是全局性的,所有的Session可以共享这个二级缓存。
2、请描述线程的生命周期,它们之间如何切换? 线程的生命周期包含 5 个阶段,包括:新建、就绪、运行、阻塞、销毁。...组合索引: 多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。...在创建空间索引时,使用 SPATIAL 关键字。要求,引擎为 MyISAM,创建空间索引的列,必须将其声明为 NOT NULL。 11、什么是散列表? select * 和 select 1?...哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。...(驱逐):禁止驱逐数据 20、Redis 持久化机制是如何做的?
浏览器如何通过域名去查询 URL 对应的 IP 呢?DNS域名解析分为递归查询和迭代查询两种方式,现一般为迭代查询。...全局作用域中的其他对象可以由用户的脚本创建或由宿主程序提供。标准内置对象的分类:(1)值属性,这些全局属性返回一个简单值,这些值没有自己的属性和方法。...例如 String、RegExp(6)可索引的集合对象,这些对象表示按照索引值来排序的数据集合,包括数组和类型数组,以及类数组结构的对象。...当我们查找一个变量时,如果当前执行环境中没有找到,我们可以沿着作用域链向后查找作用域链的创建过程跟执行上下文的建立有关....作用域可以理解为变量的可访问性,总共分为三种类型,分别为:全局作用域函数作用域块级作用域...全局作用域全局变量是挂载在 window 对象下的变量,所以在网页中的任何位置你都可以使用并且访问到这个全局变量var globalName = 'global';function getName()
,重复地产生与销毁代理线程会产生很大的系统开销,所以DB2服务器在启动时创建一个常连接池来避免重复地创建/销毁代理线程。...一方面持久化数据,另一方面给bufferpool腾出更多可置换空间供使用。...日志页读写进程db2loggr/db2loggw DB2采用的是读日志优先(Readlog ahead)的策略来持久化数据,即在将insert/delete/update的数据写入磁盘前,必须先将对这些操作的日志从日志缓冲区持久化到磁盘当中...全局死锁检测线程db2dlock 该线程主要是检测系统死锁防止因为死锁造成的应用不可用。...MySQL数据库为用户提供了20多种可插拔的存储引擎,比较常见的有如下列表所示几种: 如上图的存储引擎中,从功能上比较接近商业数据库功能的是InnoDB存储引擎。
JDK Proxy,去创建代理对象。...就是由代理创建出一个和 impl 实现类平级的一个对象,但是这个对象不是一个真正的对象, 只是一个代理对象,但它可以实现和 impl 相同的功能,这个就是 aop 的横向机制原理,这样就不需要修改源代码...做好主从 的部署,当主节点挂掉后,能快速的使用从结点顶上。实现熔断限流机制,对系统进行负 载能力控制。对于非核心功能的业务,拒绝其请求,只允许核心功能业务访问数据库获取数据。...参数如何设置? 堆内存是指由程序代码自由分配的内存,与栈内存作区分。 在 Java 中,堆内存主要用于分配对象的存储空间,只要拿到对象引用,所有线程都可以访问堆内存。 -Xmx, 指定最大堆内存。...redis 策略是,无论如何,首先会尝试进行增量同步, 如不成功,要求从机进行全量同步。
领取专属 10元无门槛券
手把手带您无忧上云