梧桐和风的博客

岁月如旅行,好坏是风景

Wait/Notify通知机制解析

Wait/Notify通知机制解析 前言 我们知道,java的wait/notify的通知机制可以用来实现线程间通信。wait表示线程的等待,调用该方法会导致线程阻塞,直至另一线程调用notify或notifyAll方法才可另其继续执行。经典的生产者、消费者模式即是使用wait/notify机制得以完成。在这篇文章中,我们将深入解析这一机制,了解其背后的原理。 线程的状态 在了解wa...

ElasticSearch笔记二:5.x版本变化

ElasticSearch笔记系列

写在前面:去年写的有关Elastic的一些知识是基于2.x版本的,目前最新的版本是5.6(2017-10),一些重要的API与用法已经发生改变。这篇文章在之前系列的基础上,重点从API角度讲讲变化的部分。 一、映射的变化 string类型变为为text/keyword 变化最大的是ES的基本类型string。目前string类型已标为废弃的,取而代之的变成了 text/keyw...

快速排序(QuickSort)实践

算法简介 快速排序(Quicksort)是对冒泡排序的一种改进算法。由C. A. R. Hoare在1960年提出。该算法使用广泛、效率很高,是最重要的排序算法之一。 该算法的实现基本可分为以下几步: 在数组中选一个基准数(通常为数组第一个)。 将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边 对于基准数左、右两边的数组,不断重复以上两个过程...

HttpUrlConnection类体系解析

背景介绍 关于HTTP协议 HTTP 协议是目前 Internet 上使用得最多、最重要的协议。该协议为典型的请求-响应模型。客户端建立连接并发送请求,服务端接受并处理请求,再发送应答,再由客户端接受并处理应答。浏览器是最常见的一种客户端,它将用户的交互行为作为http请求发送,并接受服务端的应答,再将应答内容展示,一般应答都是html类型的超文本。 在某些情况下,我们会使用java程...

多级选择组件解决实践

问题描述 这里的多级选择组件问题,指的是存在一个多级的选择组件,当点击某个节点时,该节点及其下的所有节点都要选中,若该节点并列的所有兄弟节点都已选中,则其父节点也要勾选,依此到最顶端节点。反选也类似逻辑。 这个问题也符合平日的认知习惯。如下图所示: 如点新华区,则其下所有街道都要选中,再点击桥西区,桥西区下的街道要选中,同时石家庄市这个节点要选中。若再点击廊坊市这个节点,则整...

java代理模式与JDK代理

前言 代理模式是很常用的设计模式之一,一般可分为静态代理和动态代理两类。java利用反射也对动态代理提供了支持。今天我们就来学习学习。 1. 定义 给某一个对象提供一个代理,并由代理对象控制对原对象的引用,称为代理模式。它是一种对象结构型模式。 即可理解为,某个对象实例(记为Subject)不方便直接引用,我们就提供一个代理实例(记为Proxy),让这个代理实例去调用实例对象...

ReentrantLock原理探究(二)

前言 上篇ReentrantLock原理探究(一)介绍了ReentrantLock类的使用说明,详细解析了关于非公平锁的lock()过程。这篇我们继续分析。 三、源码解析 2.unlock()方法 公平锁与非公平锁的unlock()方法相同,就不用区别了。unlock()方法调用了release()方法。 public final boolean release(int arg...

ReentrantLock原理探究(一)

前言 ReentrantLock类是synchronized语义的替代品,可以实现与其相同的功能,了解其实现原理对并发编程无疑是很有帮助的。其次,ReentrantLock 的实现基础AQS(AbstractQueuedSynchronizer)也是Java并发编程中相当重要的一个类,所以无论如何,我们都要了解一番。 一. 用法及概念 1. 用法 ReentrantLock(可重入锁...

java获取方法参数名的若干实践

文章首发于我的个人博客网站梧桐和风的博客,欢迎关注。 前言 我们知道java可以通过反射得到方法名、参数类型等信息。但我们似乎不能直接得到方法的参数名。而在一些场景中,比如构建自己的MVC框架时,我们也想像Spring MVC一样,根据参数名获取用户传来的数据。下面就来总结一下,都有哪些方法可以获得方法的参数名。 1. 使用java8 自java8开始,可以直接通过反射得到方法...

java多线程之线程通信

在多线程机制中,线程之间需要传输信息。一般有以下几种通信机制: 共享对象:通过在共享对象中设置信号量,多个线程通过读取、修改该信号量来通信。 wait/notify()方法:线程之间通过调用wait()、notify()方法实现线程等待、唤醒状态,从而达到线程通信的目的。 接下来我们分别看看这两种方法: 通过共享对象通信 在共享对象中设置信号量是最简单也是最常用的线程通信...