知行

总结之后必有收获 开始使用

java 0 篇文章

用 Redis 构建分布式锁

用 Redis 构建分布式锁

用 Redis 构建分布式锁在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段。有很多三方库和文章描述如何用 Redis 实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简单的实现其实只需采用稍微增加一点复杂的设计就可以获得更好的可靠性。最近自己基于 Redis 做了一个实现,发出来希望大家一起讨论下,看是否还有不可靠情况,能否再完善。@Value("${配置服务器标识}")pr
谈谈强引用、软引用、弱引用、幻象引用?

谈谈强引用、软引用、弱引用、幻象引用?

我们知道在Java中除了基础的数据类型以外,其它的都为引用类型。而Java根据其生命周期的长短将引用类型又分为强引用、软引用、弱引用、幻象引用 。正常情况下我们平时基本上我们只用到强引用类型,而其他的引用类型我们也就在面试中,或者平日阅读类库或其他框架源码的时候才能见到。

优雅你的代码 --Java8 Lambda 场景示例

阅读前提了解 java8 的一些新特性,如:Optional、Stream 背景一切的一切,源于不喜欢在代码中写太多的 ifelse.scene&solution1.Optional 方法描述 of 把指定的值封装为 Optional 对象,如果指定的值为 null,则抛出 NullPointerExceptionempty 创建一个空的 Optional 对象 ofNullable 把指定的值封装为 Optional 对象,如果指定
Java 并发 - - 锁

Java 并发 - - 锁

昨天有人问到了乐观锁和悲观锁的使用场景,虽然有所了解但是在 java 中关于锁的概念还有很多,今天趁着妇女之友的节日总结一下。CASCAS 全称 CompareAndSwap(比较与交换)是一种无锁算法。在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步。java.util.concurrent 包中的原子类就是通过 CAS 来实现了乐观锁。AQSAQS 是 AbustactQueuedSynchroniz
过滤器(Filter)与拦截器(Interceptor )

过滤器(Filter)与拦截器(Interceptor )

总得来说过滤器和拦截器触发时机不一样:过滤器是在请求进入容器后,但请求进入 servlet 之前进行预处理的。请求结束返回也是,是在 servlet 处理完后,返回给前端之前。所以过滤器的 doFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)的入参是 ServletRequest,而不是 httpservletreques
java8 List 转 map

java8 List 转 map

[Map 的 merge 方法]为了取数据方便,经常会有遇到 List 转 Map 的需求,这是典型的空间换时间做法。Java8 提供了 merge,方便快捷 publicstaticvoidmain(String[]args){Map<Long,List<SpuProduct>>map=New.hashMap();List<SpuProduct>spuList=New.arrayList();spuList.add(

Twitter 的分布式自增 ID 算法 snowflake (Java 版)

分布式系统中,有一些需要使用全局唯一 ID 的场景,这种时候为了防止 ID 冲突可以使用 36 位的 UUID,但是 UUID 有一些缺点,首先他相对比较长,另外 UUID 一般是无序的。有些时候我们希望能使用一种简单一些的 ID,并且希望 ID 能够按照时间有序生成。而 twitter 的 snowflake 解决了这种需求,最初 Twitter 把存储系统从 MySQL 迁移到 Cassandra,因为 Cassandra 没有顺序 ID 生成机制
优雅你的实体类 -- Lombok 代替 Getter/Setter 方法

优雅你的实体类 -- Lombok 代替 Getter/Setter 方法

大家经常在编写实体类 Model 的时候,需要生成 Getter/Setter 方法,如果一个 Model 类很多字段的时候,Model 类的代码将会很多,看起来不清爽,特此引入了 Lombok(lombok.*包)。lombok 的官方网址:http://projectlombok.org/让 IDE 支持 lombok,如果不安装插件,IDE 是无法解析 Lombok 的注解 IDEAFile–>Settings–>Plugi

Java Proxy 和 CGLIB 动态代理原理

动态代理在 Java 中有着广泛的应用,比如 SpringAOP,Hibernate 数据查询、测试框架的后端 mock、RPC,Java 注解对象获取等。静态代理的代理关系在编译时就确定了,而动态代理的代理关系是在编译期后确定的。静态代理实现简单,适合于代理类较少且确定的情况,而动态代理则给我们提供了更大的灵活性。今天我们来探讨 Java 中两种常见的动态代理方式:JDK 原生动态代理和 CGLIB 动态代理。JDK 原
分布式之数据库和缓存双写一致性方案解析

分布式之数据库和缓存双写一致性方案解析

首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存。又或者是先删除缓存,再更新数据库,其实大家存在很大的争议。从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是

maven 中 scope 标签详解

最近在做 pom 优化工作,发现对于 maven 依赖管理中的 scope 标签还是有不明白的地方,所以今天就来总结一下这方面的知识,scope 在 maven 的依赖管理中主要负责项目的部署 maven 的哲学在上次技术分享的时候也提到了:约定大于配置,所以在 maven 中,很多内容都有默认值,scope 的默认值是 compile,那么 scope 还能有哪些选项呢?scope 的分类 1.compile:默认值他表示被依赖项目需
Socket 与 WebSocket 与 http

Socket 与 WebSocket 与 http

什么是 Socket?socket 起源于 Unix,而 Unix/Linux 基本哲学之一就是“一切皆文件”,都可以用“打开 open–> 读写 write/read–> 关闭 close”模式来操作。我的理解就是 Socket 就是该模式的一个实现,socket 即是一种特殊的文件,一些 socket 函数就是对其进行的操作(读/写 IO、打开、关闭)。socket 中 TCP 的三次握手建立连接详解我们知道 tcp 建立连接要进行“三
java 常用框架相关知识 Spring MVC 和 MyBatis

java 常用框架相关知识 Spring MVC 和 MyBatis

JavaWeb 开发经典的 3 层框架:Web 层、Service 层(业务逻辑层)和 Dao 层(数据访问层)Web 层:包含 JSP 和 Servlet 等与 Web 相关的内容;业务层:只关心业务逻辑;数据层:封装了对数据库的访问细节。Spring 知识点 01.Spring 的 IOC 和 AOP 有了解吗?答:IOC:控制反转,(解耦合)将对象间的依赖关系交给 Spring 容器,使用配置文件来创建所依赖的对象,由主动创建对象改为了被
MYSQL 数据库知识点

MYSQL 数据库知识点

**01.**MySQL 和 MongoDB 的区别有哪些?如何选择?关系型数据库和文档型数据库,存储方式数据处理,架构特点。mongoDB 适于事件的记录,内容管理或者博客平台等。**02.**分析一下 Mysql 和 Mongodb 应用场景(*HBase)1.如果需要将 mongodb 作为后端 db 来代替 mysql 使用,即这里 mysql 与 mongodb 属于平行级别,那么,这样的使用可能有以下几种情况的考量:(1)
网络协议

网络协议

01.三次握手、四次挥手示意图:总共有四种状态:主动建立连接、主动断开连接、被动建立连和被动断开连接两两组合还是 4 种组合:主动建立连接、主动断开连接会经历的状态:SYNC_SENT——ESTABLISHED—-FIN_WAIT_1—-FIN_WAIT_2—-TIME_WAIT 主动建立连接、被动断开连接会经历的状态:SYNC_SENT——ESTABLISHED—-CLOSE_WAIT—-LAST_AC

Java 8 相关知识

**0.1**HashMap 的底层实现有变化:HashMap 是数组 + 链表 + 红黑树(JDK1.8 增加了红黑树部分)实现。**02.**JVM 内存管理方面,由元空间代替了永久代。区别:1.元空间并不在虚拟机中,而是使用本地内存;2.默认情况下,元空间的大小仅受本地内存限制;3.也可以通过-XX:MetaspaceSize 指定元空间大小。**03.**Lambda 表达式(也称为闭包),允许我们将函数当成参
JVM 内存管理

JVM 内存管理

01.JVM 内存划分:方法区(线程共享):常量、静态变量、JIT(即时编译器)编译后的代码也都在方法区;堆内存(线程共享):对象实例,垃圾回收的主要场所;(jdk7+ 常量)程序计数器:当前线程执行的字节码的位置指示器;虚拟机栈(栈内存):保存局部变量、基本数据类型变量以及堆内存中某个对象的引用变量;本地方法栈:为 JVM 提供使用 native 方法的服务。02.类似-Xms、-Xmx 这些参数的含义:答:堆
高并发编程

高并发编程

在 Java5.0 提供了 java.util.concurrent(简称 JUC)包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池、异步 IO 和轻量级任务框架。01.多线程和单线程的区别和联系:答:在单核 CPU 中,将 CPU 分为很小的时间片,在每一时刻只能有一个线程在执行,是一种微观上轮流占用 CPU 的机制。多线程会存在线程上下文切换,会导致程序执行速度变慢,即采用

Java 中常见集合

集合这方面的考察相当多,这部分是面试中必考的知识点。01.说说常见的集合有哪些吧?答:Map 接口和 Collection 接口是所有集合框架的父接口:1.Collection 接口的子接口包括:Set 接口和 List 接口;2.Map 接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap 以及 Properties 等;3.Set 接口的实现类主要有:HashSet