自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 资源 (1)
  • 收藏
  • 关注

原创 1.3 寻找灵感:认知系谱图

我们的内心住着一个没有父亲的孩子,这个孩子会在唱片店,大街上,历史中发现自己的父亲。在我们面对世界的时候,一些人会鼓舞我们继续前进,最终我们会选择这些人作为自己的精神教父。” —— 肖恩·科里·卡特(美国说唱歌手)它不是来自你的家庭,是通过你的老师和身边的朋友获得的,同时也包括你看过的书,听过的音乐,看过的电影,这些东西共同构建了你的知识系谱。一个比较具体的例子,你有一个母亲和一个父亲,你同时拥有他们的特点,但你还会有一些自己独有的特点。你选择让什么事物进入你的生活,这些事物就会影响你的人生。

2024-06-04 12:45:27 206

原创 1.2 寻找灵感:何为原创

因为法国作家安德烈·纪德说过:“该讲的道理之前都已经讲过了,如果有一部分人没有听到,那就需要再重说一遍。一个好的艺术家应该有这样的认知:没有毫无出处的作品。所有具有创造性的作品都是基于之前某些艺术的创新,没有完全的原创。乔纳森·勒瑟姆(美国作家)说过,当人们说一件作品是原创的时候,他们十有八九不知道这件作品的创作灵感来自于哪里。如果我们放下完全原创这种心理负担,拥抱没有完全的原创这件事,遵循这个规律,充分利用它来增加自己的创造性。未被发现的剽窃” —— 作家拉尔夫·英格。

2024-06-03 00:36:15 146

原创 1.1 寻找灵感:怎样像艺术家一样去看待这个世界

当你通过这种方式去看世界,你就不会再去思考什么东西是好的,什么东西是坏的。你看待世界的方式也变了,开始关注什么是值得偷窃的,什么是不值得偷窃的。每一样东西都是有潜在价值的,今天也许你没有发现它值得偷窃,也许明天,一个月或一年后,你就会需要。“我之前学习的艺术,让我知道我可以从哪里去偷窃它们。” —— 大卫·鲍伊(英国摇滚歌手、演员)你首先需要弄明白什么是值得你偷窃的,然后你才能继续接下来的事。“你是从哪里获取到这些创作灵感的?弄明白什么是值得偷窃的,这就足够了。怎样像艺术家一样去看待这个世界呢?

2024-06-02 16:11:59 221

原创 像艺术家一样工作:前言

根据我的观点,当一个人在给你一些忠告时,这些建议都是来自他们过去的人生经验。这本书也是我关于自己过去人生经验的总结。这些知识是我过去十年的心得体会,关于如何创造艺术。但有趣的是,当我开始分享它们的时候,我发现它们不仅仅适用于艺术家,每一个人都可以从中获益匪浅。对于每一个想要使自己的生活和工作带来一些创造性的人,这些观点都是适用的。毕竟创造性意味着可以让现状变得更好。换句话说:无论你是谁,无论你从事什么工作,这本书都会给你带来灵感。

2024-06-02 15:00:36 161

原创 像艺术家一样工作

但是偷这个词总归不太体面,所以我把书名翻译为:像艺术家一样工作。豆瓣评分还是挺高的,目前在国内没有看到有在售的翻译版本。作者可能是为了制造营销话题,所以起了这么一个名字。书名直译的话是:像艺术家一样去偷。接下来开始翻译这本小册子。

2024-06-01 12:08:13 210

原创 重学英语:输出的重要性

精通一门外语的四要素:听,说,读,写输入:听,读输出:写,说因为输入是我们可以单独完成,不需要有人互动,所以我们做得最多输出练习做得很少,尤其是在应试教育中更是如此这就好比学习游泳,一直在看别人游,学习游泳的理论知识,但是一直没有下水其实最简单的输出就是写,写日记,记录自己经历过的事情。

2024-05-29 08:34:11 402

原创 开启重学英语之路

只能说明之前的英语学习方法和学习思路只有问题的,所以不能一头扎进英语知识的学习之中,需要先反问自己一些问题,然后去寻找答案。在寻找这些问题的过程中自己不断反思,开始觉得自己之前的学习方法和对待英语的态度,是多么的愚蠢。因为不想清楚这些问题,就开始吸收英语知识,其实只是在重复之前错误的学习方法。就算是在学校考了很高的分数,依然不能流利的和外国人对话。为什么学了这么多年的英语还是不能自信的说自己擅长英语。不会有任何实质性的突破,还是保持了之前同样的英语水平。想到的重启英语学习,你想做的第一件事是什么。

2024-05-28 02:26:43 545

原创 如何写好一个函数

参数不超过三个参数过长的危害因为过长的参数可能会导致调用时候传参错误不能正确理解函数意图。

2023-08-27 16:37:05 164

原创 规则引擎对比

主流规则引擎对比

2023-06-09 17:50:05 173

原创 我对架构师的理解

何为架构师

2023-02-04 11:02:38 514 1

原创 接口幂等问题:redis分布式锁解决方案

接口幂等,redis分布式锁解决方案

2022-09-03 23:28:38 1963

原创 threadLocal为什么线程安全

看完上面这张图,也许大家会充满各种疑惑,看完下面几点可以解答其中一些疑惑:

2022-08-20 13:30:09 590

原创 列表页优化思路

性能优化

2022-07-30 12:25:01 309

原创 Markdown编辑器语法

Markdown编辑器

2022-07-30 11:53:05 107

原创 通过注解完成redis缓存接入

API接口功能说明预估QPS预计测试对接时间预计生产对接时间getHouseDetail房号获取综合信息1002022-03-282022-04-15

2022-04-05 15:34:20 5042

原创 java后端常见面试题

List、Map、Set三个接口,存取元素时,各有什么特点?list元素可以重复,有序存储,set集合元素不允许重复,map用来存放键值对为什么重写equals方法,就要重写hashCode方法先看看object默认的equals方法public boolean equals(Object obj) { return (this == obj); }默认的equals直接比较的是内存地址,我们想要的效果是类的某些属性相等,这样就需要重写equals方法在hash..

2022-02-13 12:39:12 766

原创 java线程池总结

为什么要使用线程池方便统一管理和控制线程减少创建和销毁线程的开销线程池参数核心线程数:线程池长期活跃的线程数,不会被回收的线程最大线程数:线程池允许创建的最大线程数空闲线程回收时间:超出核心线程数的线程回收时间时间单位线程池任务队列:核心线程被使用完后任务先放到任务队列待消费,最好是设置有界队列,避免出现任务无限堆积,造成内存溢出的bug任务拒绝策略:当任务队列满了,最大线程数也被使用完后,处理任务的策略池化思想:数据库连接池,http连接池,线程池在实际项目中许多地..

2022-01-27 18:07:34 321

原创 java阻塞队列和非阻塞队列的区别

阻塞队列:通过加锁的方式让队列的生产者或者消费者处于等待状态非阻塞队列:通过cas的方式来保证线程安全,多个线程可以并发生产或者消费

2022-01-27 01:47:03 2905

原创 堆数据结构总结

堆的特性:子节点都大于或小于父节点通过数组的方式来存储堆数据结构,省去了链表的前后引用,降低空间复杂度因为是数组访问节点的时间复杂度是1堆可以用来实现优先级队列

2022-01-27 01:08:13 356

原创 ConcurrentHashMap原理

如何保证线程安全:判断数组元素中是否存在key,如果不存在插入一个新的元素,通过cas的方式插入,避免了key被覆盖的情况通过synchronized关键字锁住一个元素,然后操作链表或者红黑树

2022-01-26 20:24:56 241

原创 AtomicInteger源码解析

线程不安全的场景:public class CASTest { int i = 0; public static void main(String[] args) throws InterruptedException { CASTest casTest = new CASTest(); new Thread(() -> { for (int j = 0; j < 100; j++) { .

2022-01-26 17:51:05 368 2

原创 jvm垃圾回收总结

垃圾回收器多种多样,但是都是基于三种垃圾回收算法来实现的标记——清除法:会引起内存碎片化问题标记——复制法:会造成内存使用率不高的缺点,java8新生代就是使用这种回收算法标记——整理法:也需要移动内存,java8老生代使用此方法jdk8使用的时候并行垃圾收集器java8垃圾收集器注重的是jvm的吞吐量java8垃圾收集器有自动分配新生代和老生代内存使用比例的功能,相当于是智能优化...

2022-01-16 00:24:23 90

原创 hashmap实现原理

hashmap通过数组和链表来实现的,首先通过计算key的hash值找到数组对应元素,判断当前数组下标位置是否有元素,如果没有就直接插入当前下标位置如果已经存在元素,就需要以链表的形式插入元素hashmap并不是线程安全的数据结构,多线程访问的时候会出现,value被覆盖的情况ConcurrentHashMap可以保证线程安全,hashmap通过synchronized关键字锁住当前数组元素,然后再进行链表的插入为了避免链表过大造成查询变慢,当链表超过元素超过8的时候,链表会成长为红黑树...

2022-01-14 14:44:11 106

原创 java单例模式——双重检查

public class Singleton { private volatile static Singleton singleton; public static Singleton getSingleton() { if (singleton == null) { // 这里方法是static的,所以synchronized不能锁住this对象 // 只能锁住class对象 synchroniz

2022-01-14 13:44:06 487 3

原创 java lock锁实现原理总结

lock是jdk层面的锁lock通过双向链表存储等待锁的线程lock通过cas和自旋的方式等待锁的获取

2022-01-14 01:01:35 990

原创 java锁的优化

自旋:jvm智能判断是否需要将当前线程挂起,如果等待很短的时间就可以获取到锁,就没有必要挂起线程因为挂起线程需要切换到内核空间,线程切换有性能的消耗锁删除:jvm自动识别出有些锁不会出现竞争行为,那就取消锁行为轻量级锁:通过cas方式判断是否需要加锁偏向锁:没有线程竞争的时候使用偏向锁...

2022-01-14 00:56:19 101

原创 volatile关键字总结

volatile只能保证线程的可见性和有序性,不能保证的线程的原子性,所以还是存在线程不安全的情况出现为什么不能保证原子性:因为volatile只是刷新了工作内存和主内存之间的数据,保证了两者之间的数据一致性并不像synchronized关键字是对一段代码进行了加锁处理理解了工作内存和主内存之间的数据读写操作,也就理解了volatile关键字的原理volatile的使用场景需要满足以下两个条件:变量只被一个线程修改当前变量的修改不需要依赖其他变量...

2022-01-13 22:20:30 99

原创 synchronized关键字和volatile的区别

syn关键字是从虚拟机指令的层面来锁定一段代码,同一时间只有一个线程操作,会引起线程挂起volatile关键字不会引起线程的挂起,每次都是刷新工作内存和主内存中的数据,这样就保证了多线程之间的可见性在满足使用场景的情况下优先使用volatile来修饰变量,因为volatile属于轻量级锁,可以减少线程切换的开销...

2022-01-13 21:57:58 250

原创 java工作内存和主内存

cpu从物理内存读取数据的速度远不如cpu的计算速度,为了提高cpu的使用效率,需要在cpu和物理内存之间加入cpu缓存cpu从高速缓存中读写数据,再刷新到物理内存在jvm中线程独有的内存区域为虚拟机栈,程序计数器,本地方法栈同时缓存也导致了线程不安全的问题出现,依法了多线程可见性问题总结:6. 主内存对应物理内存,对应到jvm就是堆内存7. 工作内存对应cpu高速缓存,对应jvm的虚拟机栈...

2022-01-13 21:42:28 990

原创 java synchronized关键字

synchronized关键字是重量级锁,线程遇到重量级锁的时候,线程挂起,有用户态切到和核心态,这种切换是一件消耗性能的事情lock和此关键字的区别,lock是jdk语言层面的机制,关键字是虚拟机内置的实现方式,syn经过不同版本迭代,已经做了很多优化,因此推荐优先使用synlock和原来的syn相比主要是实现了可中断,可重入的特性syn主要是通过对象的monitorenter和monitorexit实现了加锁机制jvm提供了锁的特性,方便用户编写出线程安全的程序lock的实现原理是通过一个队.

2022-01-12 23:40:44 152

原创 双亲委派模型

实现原理:类加载的时候先通过父类加载器进行加载,只有父类加载不了的时候才通过子类加载;通过查看源码,发现是通过递归方式实现的。打破双亲委派模型的场景:jdbc打破了双亲委派模型,jdk只是定义了接口方法,具体实现由不同的数据库厂商实现不同的驱动。...

2022-01-12 23:16:26 175

原创 jvm内存划分

堆:所有创建的对象都放到了这个区域,这个区域还保存了字符串常量方法区:保存了加载的类信息,常量池,静态变量虚拟机栈:线程方法执行的时候生成一个栈帧,栈帧就放到了虚拟机栈当中本地方法栈:jdk自带一些方法调用,不局限于java语言,也可能是其他的语言实现的方法,比如:C语言程序计数器:记录当前线程执行到什么位置,方便线程切换回来的时候继续执行元数据空间:java1.8之后取消了方法区,原来的方法区直接放到了本地内存,避免了出现内存溢出的情况出现本地内存:nio可以分配本地内存,本地内存的大小受机.

2022-01-12 22:21:03 148

原创 oauth2授权码模式——微信第三方登录原理

大部分第三方登录采用的都是oauth2授权码模式,下面我们以微信第三方登录为例,理解和学习授权码模式oauth2有四种授权模式,授权码模式是最常用的模式oauth2其实就是一种通用的协议,如果你的应用想要支持这种协议就需要通过代码来实现它不过也没有谁会从头开始去实现这个协议,各种编程语言已经有现成的框架已经实现了oauth2协议,直接引入框架就可以开发一个支持oauth2协议的服务器了首先思考一个问题:oauth2授权码模式是为了解决什么问题?解决的问题:方便用户登录,一个普通用户相比于输入号

2021-12-20 12:08:35 3835 3

原创 springboot接口开发框架——拦截器注册

拦截器注册定义拦截器注册拦截器加载配置类定义拦截器首先定义一个拦截器,重写请求处理前和处理后会被执行的方法public class UserHeaderIntercepter implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

2021-12-17 16:47:59 830

原创 gitignore文件修改

有没有碰到这样一个尴尬的场景:gitignore文件commit之后发现不想被提交的文件被提交了原因是gitignore文件中没有过滤解决办法:先执行:git rm -r --cached .再执行:git add .两个命令解释:从暂存区删除所有的文件,使所有文件都不受版本控制,会看到文件在idea中变成红色因为gitignore文件控制的是哪些文件可以加入版本控制,所以刚才删除之后,我们修改了gitignore文件,再次添加就可以排出不想提交的文件了。...

2021-12-17 15:48:49 766

原创 springboot接口开发框架——通过拦截器和threadlocal保存用户信息

如何传递用户信息定义请求头定义threadlocal定义拦截器threadlocal保存的信息使用运行结果定义请求头在实际开发过程中,一般把用户的一些基本信息放到http请求头,所以我们先定义一个model来保存请求头中的信息public class UserHeader { private String userId; private String version;}定义threadlocalThreadLocal定义为static类型public class UserHea

2021-12-17 13:19:09 4469 1

原创 threadLocal源码分析

threadLocal源码分析threadLocal.set()方法threadLocalMap构造如何把threadLocal保存到mapthreadLocalMap如何解决hash冲突threadLocalMap如何重新计算元素的位置threadLocal.set()方法 public void set(T value) { // 获取当前线程 Thread t = Thread.currentThread(); // 获取当前线程的ThreadLoc

2021-12-09 16:02:37 208

原创 threadLocal如何避免内存泄漏

threadLocal如何避免内存泄漏1.对象引用关系2. 什么是内存泄漏?3. threadLocal是如何避免内存泄漏的?4. 手动调用remove方法释放threadLocal1.对象引用关系线程持有threadLocalMap引用,threadLocalMap持有自定义entry元素的数组每个entry持有一个key和value这里的key被包装成一个弱引用,方便threadLocalRef出栈,或者被回收的时候,gc能够回收threadLocal2. 什么是内存泄漏?一些无法被再

2021-12-09 15:02:13 1118

原创 LFU缓存简洁的实现方式,思路清晰

package com.cause.hashmap;import java.util.Collections;import java.util.HashMap;import java.util.LinkedList;import java.util.Map;/** * least frequency used 最少使用次数缓存淘汰策略 */public class LFUCache { Map<Integer, Node> keyNodeMap = new HashMa

2021-12-05 17:09:50 274

原创 LRU缓存实现

import java.util.LinkedHashMap;import java.util.Map;public class LRUAssessOrder { Map<Integer, Integer> linkedHashMap; int capacity; public LRUAssessOrder(int capacity) { this.capacity = capacity; /** * accessOrder 根据访问频率进行排序

2021-12-05 00:54:53 502

实现可以拖动listview

可以实现像QQ消息列表那样的拖动删除功能,感兴趣的可以玩玩。

2015-01-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除