Java 8th 函数式编程:Optional 类型

NullPointException 可以说是所有 java 程序员都遇到过的一个异常,虽然 java 从设计之初就力图让程序员脱离指针的苦海,但是指针确实是实际存在的,而 java 设计者也只能是让指针在 java 语言中变得更加简单、易用,而不能完全的将其剔除,所以才有了我们日常所见到的关键字 null。 空指针异常是一个运行时异常,对于这一类异常,如果没有明确的处理策略,那么最佳实践在于让程序早点挂掉,但是很多场景下不是开发人员没有具体的处理策略,而是根本没有意识到空指针异常的存在。当异常真的发生的时候,处理策略也很简单,在存在异常的地方添加一个 if 语句判定即可,但是这样的应对策略会让我们的程序出现越来越多的 null 判定。一个良好的程序设计应该让代码中尽量少出现 null...

阅读全文

Java 8th 函数式编程:lambda 表达式

Lambda 表达式是 java 8th 给我们带来的几个重量级新特性之一,借用 lambda 表达式可以让我们的程序设计更加简洁。最近新的项目摒弃了 6th 版本,全面基于 8th 进行开发,本文将探讨 行为参数化、lambda 表达式,以及 方法引用 等知识点。 一. 行为参数化行为参数化简单的说就是将方法的逻辑以参数的形式传递到方法中,方法主体仅包含模板类通用代码,而一些会随着业务场景而变化的逻辑则以参数的形式传递到方法之中,采用行为参数化可以让程序更加的通用,以应对频繁变更的需求。 这里我们以 java 8 in action 中的例子进行说明。考虑一个业务场景,假设我们需要通过程序对苹果按照一定的条件进行筛选,我们先定义一个苹果实体: 12345678910111213141...

阅读全文

转载:细聊分布式 ID 的生成方法

需求缘起几乎所有的业务系统,都有生成一个记录标识的需求,例如: 消息标识:message-id 订单标识:order-id 帖子标识:tiezi-id 这个记录标识往往就是数据库中的唯一主键,数据库上会建立聚集索引(cluster index),即在物理存储上以这个字段排序。这个记录标识上的查询,往往又有分页或者排序的业务需求,例如: 1231. 拉取最新的一页消息: SELECT message-id ORDER BY time LIMIT 1002. 拉取最新的一页订单: SELECT order-id ORDER BY time LIMIT 1003. 拉取最新的一页帖子: SELECT tiezi-id ORDER BY time LIMIT 100 所以往往...

阅读全文

分布式事务:两阶段提交与三阶段提交

在分布式系统中著有 CAP 理论,该理论由加州大学伯克利分校的 Eric Brewer 教授提出,阐述了在一个分布式系统中不可能同时满足 一致性(Consistency)、可用性(Availability),以及 分区容错性(Partition tolerance)。 C:一致性 在分布式系统中数据往往存在多个副本,一致性描述的是这些副本中的数据在内容和组织上的一致。 A:可用性 可用性描述了系统对用户的服务能力,所谓可用是指在用户容忍的时间范围内返回用户期望的结果。 P:分区容错性 分布式系统通常由多个节点构成,由于网络是不可靠的,所以存在分布式集群中的节点因为网络通信故障导致被孤立成一个个小集群的可能性,即网络分区,分区容错性要求在出现网络分区时系统仍然能够对外提供一致...

阅读全文

Spring IoC 源码解析:获取源码

Spring工程采用Gradle做项目管理,所以我们需要在本地安装Gradle,我的的本地环境如下: Windows 10 Professional java 1.8.0_102 Gradle 3.4.1 一. 从git上下载源码123456789$ git clone https://github.com/spring-projects/spring-framework.gitCloning into 'spring-framework'...remote: Counting objects: 316377, done.remote: Compressing objects: 100% (98/98), done.remote: Total 316377...

阅读全文

基于锁分段机制的 ConcurrentHashMap 实现内幕

ConcurrentHashMap 是线程安全的 HashMap。相对于 HashTable 而言,ConcurrentHashMap 采用了 锁分段机制,即将原本对整个对象加锁的实现进行粒度细化。这也是源于 HashMap 基本的存储特性,因为许多读写请求都是被哈希到了互相独立的区域,这种情况下即使并发读写也不会相互影响,更不会有线程安全问题,而对于操作加全局锁的实现方式显然是浪费了这一天然的并发优势,我们需要加锁的位置是真正存在竞争的地方,而分段锁很好的利用了这一特点。 一. 存储结构设计在实现上,ConcurrentHashMap 内置了两个静态内部类 HashEntry 和 Segment,前者用来封装 key/value,后者则用来充当锁的角色。一个 Segment(分段)上...

阅读全文

Java 异常处理机制与最佳实践

这周小组内的学习是探讨 java 异常处理的最佳实践,今天周末,外面太闷,宅在家里对 java 的异常处理的个人立即做一个总结,如有不对的地方欢迎指正~ 一. 谈谈个人对 java 异常处理的看法维基百科对于异常处理的定义是: 异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件)。 java 语言从设计之初就提供了对异常处理的支持,并且不同于其它语言,java 对于异常采取了强校验机制,即对于编译期异常需要 API 调用方显式地对异常进行处理,这种强校验机制被一部分人所钟爱,也有一部分人狂吐槽它。持支持观点的人认为这种机制可以极大的提升系统的稳定性,当存在潜在异常的时候强制开发人员去处理异常,而反对的人则认为强...

阅读全文

转载:为什么要使用 slf4j 而不是 log4j

每一个 java 程序员都知道日志对于任何一个 java 应用程序,尤其是服务端程序是至关重要的,而很多程序员也已经熟悉各种不同的日志库如 java.util.logging、Apache log4j、logback。但如果你还不知道 slf4j(Simple logging facade for Java)的话,那么是时候去在你项目中学习使用 slf4j 了。 在这篇文章中,我们将学习为什么使用 slf4j 比 log4j 或者 java.util.logging 要优秀。自从上次我写 java 程序员的 10 个日志技巧已经有一段时间了,我已经不记得我写的关于日志的一切了。 不管怎样,让我们回到这个话题,slf4j 不同于其他日志类库,与其它有很大的不同。 slf4j(Simple...

阅读全文

理清 CountDownLatch 与 CyclicBarrier 的区别

对于刚接触信号量同学来说,CountDownLatch 和 CyclicBarrier 应该是两个比较容易混淆的组件,它们都能表示让多个线程等待某个特定事件的语义,不过在功能上还是存在一些差别,实际上它们的 关键区别在于参与的线程是否需要阻塞相互等待一起到达事件的位置,然后再继续向下执行。 这句话不是很好理解,我们通过例子来进行说明,首先来看一下 CountDownLatch。我们可以简单将其理解为一个计数器,当初始化一个 count=n 的 CountDownLatch 对象之后,需要调用该对象的 countDown() 方法来对计数器进行减值,直到计数器为 0 的时候,等待该计数器的线程才能继续执行。但是需要注意的一点是,执行 countDown() 方法的线程在执行完减值之后,并...

阅读全文

Java 并发编程:基础篇

一. 线程相关的基本概念1.1 线程的状态线程可以有 6 种状态(如下图所示),定义在 java.lang.Thread.State 枚举中,我们调用线程对象的 getState 方法来获取线程的当前状态。当我们 new 一个线程的时候,这个线程只是被 创建,还未开始运行,只有当我们调用了 start 方法之后,线程才进入 可运行 状态,这个时候线程不是马上开始运行,而是需要等待 CPU 的时间片。可运行状态包含等待 CPU 调度和处于运行两种状态,没有专门的运行态一说。 123456789// 线程的状态定义public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, ...

阅读全文

Powered by hexo & Theme by hiero   Copyright © 2015-2018 浙ICP备 16010916  号,指 · 间 All Rights Reserved.