摘要: 写在前面 在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡的作用。但是普通的余数hash(hash(比如用户id)%服务器机器数)算法伸缩性很差,当新增或者下线服务器机器时候,用户id 阅读全文
posted @ 2018-05-09 10:23 qtyy 阅读(317) 评论(0) 推荐(0) 编辑
摘要: 写在前面 先依然描述这三个锁是什么: 这里直接从《深入理解java虚拟机》粘贴过来。 偏向锁 Hotspot 的作者经过以往的研究发现大多数情况下锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里 阅读全文
posted @ 2018-05-07 10:24 qtyy 阅读(669) 评论(0) 推荐(0) 编辑
摘要: 写在前面 上周,同事写了一段ConcurrentHashMap的测试代码,说往map里放了32个元素就内存溢出了,我大致看了一下他的代码及运行的jvm参数,觉得很奇怪,于是就自己捣鼓了一下。首先上一段代码: 执行时加上jvm执行参数 -Xms512m -Xmx512m ,执行结果: 最开始的代码是没 阅读全文
posted @ 2018-05-02 09:54 qtyy 阅读(3547) 评论(0) 推荐(1) 编辑
摘要: .... 2.2.1 保存到什么地方 程序运行时,我们最好对数据保存到什么地方做到心中有数。特别要注意的是内存的分配。有六个地方都可以保存数据: (1) 寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们 阅读全文
posted @ 2018-04-20 10:33 qtyy 阅读(525) 评论(0) 推荐(0) 编辑
摘要: 写在前面 前面三篇博客分别介绍了CyclicBarrier、CountDownLatch、Semaphore,现在介绍并发工具类中的最后一个Exchange。Exchange是最简单的也是最复杂的,简单在于API非常简单,就一个构造方法和两个exchange()方法,最复杂在于它的实现是最复杂的(本 阅读全文
posted @ 2018-03-08 14:08 qtyy 阅读(240) 评论(0) 推荐(0) 编辑
摘要: 写在前面 Semaphore是一个计数信号量,它的本质是一个"共享锁"。 信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可 阅读全文
posted @ 2018-03-08 12:46 qtyy 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 写在前面 CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。 注意比较CountDownLatch和CyclicBarrier: 阅读全文
posted @ 2018-03-08 10:36 qtyy 阅读(253) 评论(0) 推荐(0) 编辑
摘要: 写在前面 CountDownLatch所描述的是”在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待“:用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程, 阅读全文
posted @ 2018-03-08 09:57 qtyy 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 写在前面 重入锁ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,但是在大多数场景下,大部分时间都是提供读服务,而写服务占有的时间较少。然而读服务不存在数据竞争问题,如果一个线程在读时禁止其他线程读势必会导致性能降低。所以就提供了读写锁。 读写锁维护着一对锁,一个读锁和一 阅读全文
posted @ 2018-03-07 11:18 qtyy 阅读(304) 评论(0) 推荐(0) 编辑
摘要: 写在前面 在没有Lock之前,我们使用synchronized来控制同步,配合Object的wait()、notify()系列方法可以实现等待/通知模式。在Java SE5后,Java提供了Lock接口,相对于Synchronized而言,Lock提供了条件Condition,对线程的等待、唤醒操作 阅读全文
posted @ 2018-03-06 21:03 qtyy 阅读(343) 评论(0) 推荐(0) 编辑
摘要: 写在前面 ReentrantLock,可重入锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是ReentrantLock提供了比synchronized更强大、灵活的锁机制,可以减少死锁发生的概率。 API介绍如下: 一个可重入的互斥锁定 Lock,它具有与使用 syn 阅读全文
posted @ 2018-03-01 16:36 qtyy 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 写在前面 在前面提到过,AQS是构建Java同步组件的基础,我们期待它能够成为实现大部分同步需求的基础。AQS的设计模式采用的模板方法模式,子类通过继承的方式,实现它的抽象方法来管理同步状态,对于子类而言它并没有太多的活要做,AQS提供了大量的模板方法来实现同步,主要是分为三类:独占式获取和释放同步 阅读全文
posted @ 2018-03-01 16:30 qtyy 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 写在前面 Java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchronized还是存在一些缺陷的:虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JV 阅读全文
posted @ 2018-03-01 16:12 qtyy 阅读(262) 评论(0) 推荐(0) 编辑
摘要: 写在前面 本文是以同tomcat 7.0.57。 jdk版本1.7.0_80为例。 线程池在tomcat中的创建实现为: 同时(重点):tomcat的线程池扩展了jdk的executor,而且队列用的是自己的task queue,因此其策略与jdk的有所不同,需要注意一下。 tomcat线程池策略 阅读全文
posted @ 2017-09-12 14:35 qtyy 阅读(1047) 评论(0) 推荐(0) 编辑
摘要: 摘要: 本篇为参考别人的文章(http://blog.csdn.net/voidccc/article/details/40077329) 1 各种树形结构 本来不打算从二叉搜索树开始,因为网上已经有太多相关文章,但是考虑到清晰的图示对理解问题有很大帮助,也为了保证文章完整性,最后还是加上了这部分。 阅读全文
posted @ 2017-09-09 16:45 qtyy 阅读(293) 评论(0) 推荐(0) 编辑
摘要: 一、写在前面 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常 阅读全文
posted @ 2017-09-06 17:37 qtyy 阅读(594) 评论(0) 推荐(0) 编辑
摘要: 写在前面 之前探索tomcat7启动的过程中,使用了线程池(ThreadPoolExecutor)的技术 线程池ThreadPoolExecutor JAVA语言为我们提供了两种基础线程池的选择:ScheduledThreadPoolExecutor和ThreadPoolExecutor。它们都实现 阅读全文
posted @ 2017-09-05 08:20 qtyy 阅读(355) 评论(0) 推荐(0) 编辑
摘要: 写在前面: 本文是直接拿取的别人的实验数据作参考,然后对数据作分析。 参考网友的测试数据结果: 在网上一直看到的是or和in的效率没啥区别,一直也感觉是这样,前几天刚好在看《mysql数据库开发的36条军规》的文章,里面提到了or和in的效率问题,文中提到or的效率为O(n),而in的效率为O(lo 阅读全文
posted @ 2017-08-31 10:57 qtyy 阅读(21278) 评论(1) 推荐(0) 编辑
摘要: 写在前面 在之前的文章中有写到,Spring在配置中,会存在大量的切面配置。然而在很多情况下,SpringAOP 所提供的切面类真的不是很够用,比如想拦截制定的注解方法,我们就必须扩展DefalutPointAdviso类,自定义一个切面类,然后在Spring配置文件中进行切面的配置。 (Sprin 阅读全文
posted @ 2017-08-16 10:58 qtyy 阅读(525) 评论(0) 推荐(0) 编辑
摘要: 写在前面 Spring将introduction通知看作一种特殊类型的拦截通知。用Spring的行话来讲,对方法的增强叫做Wearing(织入),而对类的增强叫introduction(引入)。Introduction Advice(引入增强)就是对类的功能增强,它也是Spring AOP 提供的一 阅读全文
posted @ 2017-08-15 16:37 qtyy 阅读(1399) 评论(0) 推荐(0) 编辑