自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 Balking 模式

Balking 模式Balking 与 Guarded Suspension模式类似,本质上是一种规范化解决“多线程版本if”的方案。两者之间的不同在于,Balking模式在条件变量不满足时,直接退出;而Guarded Suspension模式会等待到条件变量满足时,继续往下执行。Balking模式典型应用场景,使用synchronized单次初始化class InitTest{ boolean inited = false; synchronized void init() {

2021-12-29 22:34:32 380

原创 Thread-Per-Message 与 Worker Thread 模式

Thread-Per-Message 与 Worker Thread 模式并发编程领域的问题总结为三个核心问题:分工、同步和互斥。Thread-Per-Message模式旨在解决“分工”的问题,该模式为每个任务分配一个独立的线程。在java中,为每个任务创建、销毁线程的成本很高,所以Thread-Per-Message 模式在java世界并不流行。进而出现了Worker Thread 模式,Worker Thread 模式好比车间里的工人,有活儿了,大家一起干,没活了就聊聊天等着,车间里的工人数量往

2021-12-29 22:33:38 226

原创 多线程中的设计模式

多线程中的设计模式Immutability 模式共享变量不可变,便是线程安全的,同时也是高效率的,无状态的服务也是安全的,不会成为分布式系统的性能瓶颈类的属性用final修饰提供只读的方式访问属性类通过final修饰????:当属性为对象时,应考虑不变性的边界,即作为类属性的对象,拥有的属性是否可变上述三个条件保证了类的不可变性Immutability模式的应用享元模式,可以理解为一个对象池的模型,对象存在时,直接获取,对象不存在时,先创建,放入池中,再使用;目的是减小内

2021-12-29 22:33:00 140

原创 Guarded Suspension模式

Guarded Suspension 模式考虑一个场景,当两个服务通过MQ进行交互时,服务A生产消息,服务B消费消息,两者为异步操作,我们如何来保证A消费到B返回的结果呢?Guarded Suspension模式所谓 Guarded Suspension,直译过来就是“保护性地暂停”。Guarded Suspension模式的结构图如下,其中包含:一个受保护的对象GuardedObject两个成员方法:get(Predicate p) 和 onChanged(T obj)方法Guard

2021-10-08 11:42:29 548

原创 Synchronized 实现原理

synchronized锁定某个对象,才能访问某段代码public class SynchronizedTest { static Object lock = new Object(); static List<Integer> list = new ArrayList<>(10); public static void main(String[] args) { synchronized (lock) { li

2021-09-09 23:06:16 187

原创 Fork/Join 2021-09-01

Fork/Joinjdk除了提供ThreadPoolExecutor这样的线程池,还提供了ForkJoinPool,顾名思义,先fork,再join,先分解任务,处理各个子任务,再合并,采用“分治”的思想分治,分而治之。把一个复杂的问题分解成多个相似的子问题,然后再把子问题分解成更小的子问题,直到子问题简单到可以直接求解像归并排序,快速排序,二分查找都属于分支算法,以及大数据领域计算框架MapReduce同样利用了分支思想分治任务模型任务的分解ⅰ将任务分解到可以直接计算结果的粒度结

2021-09-01 15:58:37 124

原创 索引 复习大纲

什么是索引索引的有点和缺点索引的底层数据结构hash索引的优点和缺点B树 和 B+树的区别B+ 树的数据结构是怎样的B + 树的优点和缺点主键索引 和 二级索引二级索引分类:唯一索引,普通索引,前缀索引,全文索引聚簇索引和非聚簇索引,定义,优点和缺点分别是什么覆盖索引哪些列建议创建索引,哪些列不建议创建索引MySQL如何创建索引...

2021-08-24 00:40:53 93

原创 JVM 常用分析工具

JVM 命令行工具常用JDK命令行工具在JDK安装目录的bin下,jpsjstackjstatjinfojmapjhatjps 查看所有的Java进程命令作用jps -q查看当前服务器上所有的Java进程jps -l与上述操作类似,同时显示启动类名jps -v查看对应进程的jvm参数jps -m查看对应进程启动时,传给main函数的参数jps -ljps -vstat 监视虚拟机各种运行状态信息如查询类加载信息,JI

2021-08-11 23:38:45 318

原创 JVM复习

JVM垃圾回收垃圾回收的基本过程对象优先在eden区分配大对象直接进入老年代长期存活的对象将进入老年代动态对象的年龄判定主要进行gc的区域空间分配担保对象如何判定死亡引用计数法可达性分析算法引用四大类型不可达对象并非“非死不可”如何判断一个常量时废弃常量如何判断一个类是无用的类垃圾收集器SerialParNewParallel ScavengeSerial OldParallel OldCMSG1...

2021-08-08 12:28:29 72

原创 JVM 参数

记录下常用JVM 参数记录,以便查阅-Xms最小堆大小-Xmx最大堆大小-Xmn新生代大小-Xss每个线程分配的栈大小-XX:MetaspaceSize元空间大小-XX:MaxMetaspaceSize最大元空间大小-XX:ReservedCodeCacheSizeJIT 存放二进制文件内存大小-Djava.util.Arrays.useLegacyMergeSortCompararor保持jdk1.6的排序规则-XX:M

2021-08-08 00:10:56 104

原创 StampedLock 2021-07-27

StampedLockStampedLock是比ReadWriteLock效率更高的读写锁StampedLock支持写锁,悲观读锁和乐观读悲观读锁StampedLock lock = new StampedLock();long rStamp = lock.readLock(); try { ... } finally { lock.unlockRead(rStamp);}写锁long wStamp = lock.writeLock()

2021-07-27 13:11:31 73

原创 ReadWriteLock 2021-07-27

ReadWriteLockJava除了提供管程和信号量两种同步原语,还提供了ReadWriteLock,StampedLock等,目的是分场景优化性能,提升易用性。读多写少是并发场景中非常普遍的,我们通常使用缓存来解决此类问题。缓存之所以能提升性能,重要的条件就是缓存数据一定是读多写少。Java SDK中为我们提供了读写锁ReadWriteLock,使用方便,性能也很好。读写锁的特性允许多个线程同事读取共享变量只允许一个线程写共享变量若一个写线程正在执行写操作,此时禁止读线程读共享变量

2021-07-27 00:42:44 80

原创 Semaphore 2021-07-27

Semaphore信号量,用于实现资源限流的工具类,允许多个线程同时访问同一临界区信号量模型,一个计数器,一个等待队列,三个方法三个方法,init(),设置计数器的初始值down(), 计数器值减一,计数器值<0,线程阻塞,加入等待队列up(), 计数器值加一,计数器值<=0,唤醒等待队列中的一个线程,从队列中移除上述三个方法都是原子性的,是由信号量模型的实现方来保证的。java中通过Semaphore实现信号量,借助**acquire()和release()**来控

2021-07-27 00:12:51 75

原创 Lock和Condition 2021-07-22

Lock与ConditionLock为什么java有了语言层面的synchronized,还在SDK中提供了Lock这种互斥锁呢?synchronzied 有可能会 产生死锁,而Lock 是可以中断的锁,可以破坏死锁中“占用且不可抢占的条件”。Lock支持响应中断、支持超时,并且支持非阻塞地获取锁,完美解决了“不可抢占”的问题。Lock提供的API,//支持中断lockInterruptibly() throws InterruptedException //支持超

2021-07-22 23:59:10 124

原创 安全性问题、活跃性问题和性能问题 2021-07-08

并发编程带来的问题,从微观上来说,是可见性,原子性和有序性问题,从宏观角度来说,便是安全性,活跃性和性能问题。何为安全性平时我们常谈到,这个方法是不是线程安全的,这个类是不是线程安全的等等。何为线程安全?便是程序执行结果的正确性,程序执行结果是我们预期的。安全性问题,是因为多个线程同时对共享资源进行读写,由于竞态条件(指程序的执行结果依赖线程执行的顺序),导致数据不一致而产生,那么只要我们不对数据进行共享,或者对共享资源的操作,只能读不能写,和互斥,便能杜绝安全性问题。可以通过Thread Loca

2021-07-08 23:54:14 117

原创 “等待-通知机制” 2021-07-08

用synchronized实现等待-通知机制通过java内置的synchronized配合wait(), notify(), notifyAll()即可实现“等待-通知”机制,经典的范式如下,① synchronized(lock) { while(条件不满足) { lock.wait(); } ... lock.notify(); }② synchronized(lock) { while(条件不满足) { lock

2021-07-08 22:23:41 115

原创 死锁 2021-07-06

死锁发生的四个条件1. 互斥2. 占用且等待3. 资源不能被抢占4. 循环等待解决死锁,破坏四个条件中的某个1. "互斥"不能被破坏,锁就是互斥的2. 破坏"占用且等待条件",一次性获取需要的所有资源3. java中针对synchronized,破坏"资源不能被抢占"条件不现实,synchronized锁住资源后,资源不会被 其他线程抢占5. 破坏"循环等待"条件,每个线程都需要按照指定顺序申请资源...

2021-07-07 23:01:32 73

原创 互斥锁 2021-07-05

count +1 操作是原子操作吗?count +1 不是原子操作。 ????count+1操作过程如下,1. 将count从内存读入cpu寄存器2. cpu寄存器计算,得到结果3. 将结果回写内存或者cpu缓存(缓存机制导致)由于count+1不是原子操作,当多线程操作共享变量count时,因为线程切换带来了原子性问题。根据volatile的经验,我们按需禁用线程切换不就ok了嘛 ????操作系统做线程切换是依赖cpu中断的,所以禁用cpu发生中断就能禁止线程切换禁用线程切换,在早

2021-07-07 23:00:01 168

原创 解决可见性和有序性问题 2021-07-02

并发编程bug的源头便是cpu缓存、线程和编译优化带来的可见性、原子性和有序性问题。那么如何解决上述中的可见性和有序性问题?禁用缓存和编译优化,即可保证可见性和有序性,但是程序性能就堪忧了。那么我们按需禁用缓存和编译优化,便是一种合理的方案。于是,Java内存模型出现了。JMM规范了JVM如何提供按需禁用缓存和编译优化的方法。具体来说,包括volatile、synchronized和final三个关键字,以及六项Happens-Before规则。volatilevolatile本意即为禁用cp

2021-07-07 22:55:12 91

原创 并发编程bug的源头 2021-07-07

并发编程为什么容易出现问题?它是怎么出问题的?并发程序幕后的故事随着硬件技术的发展,CPU、内存和I/O设备迎来了迅猛的发展。然而发展过程中,一直存在一个核心矛盾,CPU和内存的速度差异,内存和I/O设备之间的速度差异。CPU是天上一天,内存便是地上一年;内存是天上一天,那么I/O设备是地上10年。 木桶效应告诉我们要减小三者之间的差距,才能提高程序的性能。解决方案, 1. CPU增加缓存,以均衡与内存的速度差异 2. 操作系统增加进程、线程,分时复用CPU,进而均衡CP

2021-07-07 22:52:42 124

原创 引子--2021-07-01

管程作为一种解决并发问题的模型,是继信号量模型之后的一项重大创新。很多语言都支持管程,搞懂管程,对学习并发编程有很大帮助。然后很多人急于学习Java并发编程技术,却忽略了技术背后的理论和模型,而理论和模型却往往比具体技术更为重要。并发编程可以总结为三个核心问题:分工、同步、互斥。分工指的是如何高效地拆解任务并分配给线程。同步指的是线程之间如何协作,互斥则是保证同一时刻只允许一个线程访问共享资源。Java SDK并发包很大部分内容都按照这三个维度组织,Fork/Join框架是一种分工模式,Count

2021-07-07 22:49:39 60

原创 SQL必知必会【极客时间笔记】

SQL必知必会SQL按照功能划分为以下4个部分,DDLData Definition Language数据定义语言,定义数据库对象:库,表和列;创建、删除和修改数据库和表结构DMLData Manipulation Language数据操作语言,增加、删除和修改数据库中的记录DCLData Control Language数据控制语言,定义访问权限和安全级别DQLData Query Language数据查询语言,用于查询想要的记录Sql是如

2021-07-07 22:29:40 1002

原创 Spring 小计

curlcurl http://localhost:8080/hellohello worldactuatorcurl http://localhost:8080/actuator/health{"status":"UP"}启动Java进程java -jar java -jar Spring-0.0.1-SNAPSHOT.jar// nohub 表示后台启动程序,打印日志到指定文件 (linux)nohub java -jar java -jar Spring-0.0.

2021-06-24 23:26:23 91

原创 2021-04-21

final、finally 和 finalize 的区别1. 基于概念final - 用于修饰类、属性和方法修饰类:类不可被继承修饰属性:属性为基本类型时,值不可修改;属性为引用类型时,指向的内存地址不可修改修饰方法:方法不能被重写finally - 用于重要代码的执行,如文件资源、网络资源回收finalize - Object#finalize()会在对象被回收前执行2. 基于安全与性能用final修饰的类不能被继承,用final修饰的方法不能被重写,保证了公用类的安全性,因为不能被

2021-04-21 21:59:25 93 1

原创 2021-04-19

Java异常处理Java语言提供了相对完善的异常处理机制,异常体系如下,Throwable为异常体系顶层接口,所有异常均继承自该类Throwable分为Error和ExceptionError和Exception有何区别?Error:是指在正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序(比如JVM自身)处于非正常的、不可恢复状态。此情况下无需捕获处理Exception:是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理Exception 分类c

2021-04-19 23:18:22 86

原创 阅读《代码整洁之道》的一些感悟

有意义的命名名副其实通过名称能看出变量代表的含义int d;// 消逝的时间int elapsedTimeInDays;int daysSinceCreation;选择体现本意的名称能让人更容易理解和修改代码public List<int[]> getThem() { List<int[]> list1 = new ArrayList<int[]>(); for (int[] x : theList) if (x[0]

2020-09-24 21:42:40 197

原创 数据库异常

MySQL连接mysql的时区问题java.sql.SQLException: The server time zone value ‘�й���׼ʱ��’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the ser...

2020-04-06 12:09:46 292

原创 责任链模式

责任链模式有的时候,客户端请求发给服务器处理之前,需要进行一系列的预处理,每次预处理由某个对象完成(完成一定职责),一系列的对象形成了链条,这就是责任链模式(Chain of Responsibility Pattern)假如我们在论坛发表文章,那么服务端在发表或者存入数据库之前,会对文章内容进行安全检查,安全检查分为很多类,这里我们使用责任链模式来实现...

2020-02-14 11:39:08 184

原创 装饰者模式

装饰者模式什么是装饰者模式?英文为Decorator Pattern,见闻生义,就是用来装饰对象的设计模式。如何装饰?通过将实例对象传入装饰者对象,达到装饰的目的,增强了原对象的功能为什么要使用装饰者模式?为了避免通过继承方式达到增强目的,降低耦合;在不修改类结构的基础上,动态增强该对象装饰者模式的UML图这里我们使用形状的例子来给大家讲解装饰者模式将各种物体形状抽象为接口S...

2020-02-12 23:52:41 120

原创 工厂模式 Factory

工厂模式工厂模式分为两种,工厂方法和抽象工厂工厂方法用于定制任意的产品,而抽象工厂用于定制任意的产品族什么是工厂?凡是能够生成对象的方法或类,都可以称作工厂什么是工厂方法?不同的对象通过不同的工厂来创建,可以指定各个对象的具体创建过程,如在创建对象前需要做什么,创建之后需要做什么,最终返回对象Car的工厂方法//Carpublic class Car impleme...

2020-02-12 11:46:45 167

原创 策略模式 Strategy

策略模式策略模式是将算法族抽象为接口,再将此接口与业务对象组合起来,实现不同策略功能的设计模式,该模式要求所有的策略具体类都实现一个顶层接口,该顶层接口包含一个抽象的策略方法策略模式UML类图如下实例为比较器的一个策略模式实现...

2020-02-11 11:59:30 180

原创 单例模式 Singleton

单例模式简介单例模式保证内存中对象只存在一个实例单例模式分为饿汉式和懒汉式饿汉式特点当类被加载到内存时,就会实例化对象,保证JVM线程安全缺点:不管使不使用,类加载时就会实例化懒汉式特点按需加载,类尽管被加载到内存中,但不会立刻被实例化第一次使用时会实例化,以后便存在内存中缺点:多线程访问时,可能会创建多个实例8种单例模式第一种 饿汉式/** ...

2020-02-11 11:17:13 119

原创 获取request中的ip地址

获取request中的ip地址服务器获取用户请求中的ip地址直接访问通过代理服务器访问服务器获取用户请求中的ip地址服务器获取用户请求中的ip地址分为两种情况1.客户端直接访问服务器资源2.客户端访问反向代理服务器来访问服务器资源直接访问String ip = request.getRemoteAddr();通过代理服务器访问 String ip = request.getH...

2019-09-16 11:30:40 2651

原创 win10环境下maven的安装与配置

1.首先去官网下载最新版maven压缩包2.本地解压后放在计算机相应位置3.配置环境变量新建变量MAVEN_HOME,变量值为maven所在文件路径在变量Path中添加%MAVEN_HOME\bin%dos下输入mvn -v验证maven是否安装成功4.配置本地仓库:在maven同级目录下创建maven-repository,配置setting.xml【C:\Program Fi...

2019-03-29 22:49:48 192

原创 回文字符串(回文数)

中心拓展法求最大回文长度import java.util.Scanner;/** * 中心拓展法求输入字符串最大回文长度 * 1.字符串长度为奇数时 * 2.字符串长度为偶数时 * @author hg * */public class PalindromeNumberDemo { public static int isPalindrome(String str) { ...

2019-03-28 21:06:26 763

原创 tomcat版本与jdk版本的对应关系

来自于Tomcat官方网站的对应关系

2019-01-26 15:49:19 4240

空空如也

空空如也

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

TA关注的人

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