自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 spring学习-第三讲-bean的生命周期

*** @Description: BeanPostProcessor,这个怎么和现有的bean整合起来呢*/@Slf4jlog.info("bean对象在初始化前调用processor方法");log.info("bean对象在初始化后调用了processor方法");根据上面的流程,我这面就突然理顺了很多东西。首先,bean的生命周期如下:通过构造函数,对容器内所有注册的bean进行实例化。

2023-04-04 17:34:46 536 1

原创 spring学习-第二讲-BeanFactory和ApplicationContext的实现

beanFactory的工作流程:创建一个原生的BeanFactory容器。创建要创建的类型定义,BeanDefition类。将BeanDefition注册至BeanFactory上,设置单例属性等等。加载处理器至BeanFactory上。将处理器中的BeanFactoryPostProcessor以及BeanPostProcessor区别,并注册至BeanFactory中。最终调用实例化前单例对象方法,对其完成创建。

2023-03-30 15:08:35 313

原创 spring学习-第一讲-beanFactory与ApplicationContext

因为初步学习,所以有很多东西其实并不是很了解,需要自身在后面学习的差不多了,然后再继续巩固。

2023-01-17 17:18:21 494

原创 分布式锁-简单入门

不谈大概念,就是简单入门以及使用。为什么要用分布式锁呢?假设我需要一个定时操作,每天在某个点,我要处理一批数据,要先从数据库中查询出来(IO操作),然后再逐步处理数据(CPU操作)。这些数据之间没有关联关系,不需要考虑数据执行的先后顺序。上述的测试可以通过,只是一个简单样例,来理解一下它的思想。其实真正使用的时候吧,配置之类的肯定是不简单的。我也没有实际生产用过,只是先提供给大家一个思路。

2022-11-22 18:11:30 927 1

原创 JVM阶段(6)-方法区回收

方法区的回收,看起来是存在一定争议的。JVM虚拟机规范中并没有要求虚拟机强制回收方法区。在书中,也讲解了,JDK11版本的ZGC,其实就不包含方法区回收的内容。因为,相对堆而言,方法区回收内容比较少。其实常见的回收只有运行时常量池回收以及类卸载。

2022-09-04 17:27:56 384

原创 JVM阶段(5)-引用系列

JVM虚拟机为什么要划分为四种引用类型,强引用(reference),软引用(soft reference),弱引用(weak reference),虚引用(phantom Reference)四种呢?在最开始jdk1.2的时候,java其实只有强引用的,即在reference中只包含了一块内存的起始地址,代表了它是某个对象,某个地址方面的引用。但是,有一些额外的场景,需要我们创建一些生存周期不是那么长的对象,就比如缓存吧。这个就不好满足了,所以划分了如下四种。

2022-09-04 17:10:36 507

原创 github无法电脑登录,手机可以登录

虽然翻出去也不知道干啥吧,但是,国内搜索引擎,确实拉,而且很多经典网站,用的都是国外的资源,就像stackoverflow,访问受限,难受。但是,chrome还是访问不了,因为平时工作,或者生活都用chrome浏览器,所以装了很多乱七八糟的插件,访问不了。最近一直想登github,手机可以访问,但是电脑登不上去,修改了hosts也没用,退而求其次,gitee,但阉割版就是阉割版,今天,再试试。在网上也找了很多资料,就是修改hosts的那一套,都是通过ipAdress查找,然后覆盖。最后换了个火狐,通了。

2022-09-03 20:13:14 2419

原创 JVM阶段(4)-回收策略

回忆一下,运行时数据区哪些部分会产生OOM异常,如果无休止的创建对象,或者类信息,或者往运行时常量池塞数据,都可能导致OOM。为了避免这种情况,就需要去考虑底层的垃圾收集。那么,哪些内存需要回收。什么时候来回收。如何回收。这三个问题,其实就是垃圾回收器的本质。当然,先从哪些内存需要回收说起。其实主要就是堆和方法区,其它的都是线程私有,线程挂,直接无。

2022-09-02 15:31:50 285

原创 JVM阶段(3)-OutOfMemoryError异常

前两节的内容,说实在的,书上讲的比较宏观,接下来就是看看OOM,从细节上分析吧。第一节学的运行时数据区讲过了,可能出现OOM问题的区域。程序计数器是不可能出现的,堆是高发区,栈的话如果栈帧过大并且没有设置栈深度,可能会出现。方法区的话,也可能会出现,比如运行时常量池,还有类信息的加载。以及非运行时数据区直接内存影响堆。这些都是,接下来就细化代码写一下。...

2022-08-31 20:30:49 504

原创 JVM阶段(2)-对象

在读取对象创建的时候,我在创建过程中和类的加载过程感觉是息息相关的,好好捋一下。在JAVA代码中,我们创建普通对象只需要通过new来进行创建。在在虚拟机底层,却包含了许多东西。1.首先,在调用new关键字时,虚拟机此时会碰到一个new指令,首先通过这个new指令所带的参数去在常量池(.class的常量池)中去 寻找是否包含该类的符号引用,并且检查这个类的符号引用是否已经被类加载,解析和初始化。如果没有,则对当前的类执行类加载过程(加载)。2.类加载过程通过后,会给当前对象来进行内存的分配。...

2022-08-26 19:56:40 182

原创 JVM阶段(1)-运行时数据区

在C语言,C++两种语言中,创建对象时,也意味着我们需要手动销毁这个对象,也就是构造函数与析构函数。但在java中,开发却并没有涉及到关于对象销毁的这个操作。因为java底层封装了垃圾回收器,来保证对无用对象的回收。JVM中存在哪些内存区域,垃圾回收器又怎么回收,从什么地方开始回收,都是需要了解的,否则,出现问题,没法排查是个硬伤。先从底层结构开始了解。

2022-08-22 20:57:41 228

原创 JSP跨域嵌套JSP

同样是迁移项目中遇到的问题,具体来源就不说了,说一下场景,我有两个项目,web以及voice。这两个项目,web项目的iframe框架标签,src属性需要嵌入voice项目中jsp,但是在使用过程中,给我报Refused to display 'http://xxxxxxxxxxxxx' in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'.,无法跨域。代码是这么写的。所在的frame标签。

2022-08-19 17:56:10 906

原创 mysql 多数据源与事务嵌套不兼容解决方案

最近,因为某一个项目需求的数据量过大,已经对其它服务造成了一定的影响。所以为了给数据库减负,将这部分业务需求涉及到的数据给迁到新库中。但这就出现了个问题,这部分业务涉及到的业务表我虽然迁到新库中,但涉及到一些扩展类的业务表,比如日志信息等,因为监控的是整个系统的日志,所以肯定不能把这个表给单独拿出来。所以,这里就涉及到了双数据源的访问。并且在一个方法中涉及到双数据源问题,切换以及对应的事务信息怎么解决。

2022-08-19 17:20:32 732

原创 java程序员未来学习规划(欢迎各位大佬提建议)

接下来,计划看的书,就是中间件方面了。我提出了对应的问题,我只有一点基础,我没有实战经验,如果让我从头开始封装,我担心以我的知识储备,无法完善的解决问题。所以,接下来的打算,redis书籍,mq的书,es的书我都得看,必须结合开源代码自己试图配置一下靠谱的环境。这本书其实内部还是理论居多,使用方式,样例都是比较简单的(难的也看不明白),针对于底层的一些复杂实现,其实也是讲了一下各类原理,其实针对于普通程序员,也够用了。我是干Java的,现在所在的公司,虽然是采用的微服务架构方式,但该怎么说,似是而非。...

2022-08-10 18:21:56 1763

原创 HashMap源码解读

为了应付面试,所以就着HashMap看一下源码,网上的面试题,五花八门的太多了,感觉不太对劲,还是自己看看吧。构造方法其实就是给负载因子loadFactor以及扩容时元素个数threshold赋值,真正创建Node数据的操作,源自于put方法中的resize()方法。Put方法put方法,底层调了个putVal方法,第四个参数代表如果在hashMap中存在key相同的情况下,是否替换value,false代表替换,第五个参数在hashMap的put方法中用到的方法是个空方法体,先不用考虑。

2022-06-29 15:48:43 58

原创 线程学习(33)-Semaphore,CountDown,以及CyclicBarrier

无用

2022-06-22 11:38:02 88

原创 线程学习(32)-AQS

AQS,全称是AbstractQueuedSynchronizer,是阻塞锁和相关的同步器的框架。AQS内部核心。1.state,用过state属性来表示资源的状态,分为独占锁与共享锁,子类会根据这个状态来维护获取锁和释放锁的方式,来决定锁的类型。getState(),获取当前状态setState(),给当前状态赋值compareAndSetState,使用CAS的方式给State来进行赋值。就像AQS的内部的acquire以及relaese等系列方法,都是针对于AQS的状态来进行更改。2.Node阻塞队列

2022-06-20 17:12:57 120

原创 线程学习(31)-异步模式之工作线程

让有限的工作线程(Worker Thread)来轮流异步处理无限多的任务。也可以将其归类为分工模式,它的典型实现就是线程池,也体现了经典设计模式中的享元模式。不过利用线程池处理任务时,需要注意一下,就我这里写了个生产者消费者,因为在生产者,消费者中,如果消费速度跟不上生产速度,那么很可能生产者将线程池中的所有资源都占有,并且wait等待,就没有办法继续进行工作了。 创建多少线程池合适CPU密集型运算通常采用 cpu 核数 + 1 能够实现最优的 CPU 利用率,+1 是保证当线程由于页缺失故

2022-06-19 12:52:32 140

原创 线程学习(30)-线程池

ThreadPoolExecutor内部由一个32位的字段ctl来标识线程池的状态。其中前三位代表线程池的状态,后29位代表了线程池的数量。线程池的状态共划分为RUNNING(111),SHUTDOWN(000),STOP(001),TIDYING(010),TERMINATED(011)。默认情况下,TERMINATED>TUDYING>STOP>SHUTDOWN>RUNNING状态。第一位其实是正负号。RUNNING代表了线程池正在运行。SHUTDOWN代表了线程池不会接收新任务,但会将阻塞队列中的任务

2022-06-18 21:27:27 279

原创 线程学习(29)-自定义线程池

听了老师讲了一次,自己又敲了一次,线程池这块自定义一个简单的是可以勉强做到了。自定义线程池在老师的讲解下,其实共划分了三项,分别为阻塞队列,worker线程派生,以及线程持类。阻塞队列是一个生产者消费者模式的应用方式,因为它的目的就是为了在核心线程满了时,将内容存放至阻塞队列中(生产者),在阻塞队列满了时,会wait阻塞等待,然后等核心线程的内容执行完成后。阻塞队列的内容被消费。worker线程,其实就是继承了Thread类,只不过在run方法中,会对任务进行监听,会采用一个for循环,如果当前持有的任务执

2022-06-17 12:39:13 123

原创 线程学习(28)-连接池

分析一下,最简单的连接池要有什么?属性的话需要有连接数,以及连接数组,以及连接状态(代表当前连接是否被用)。以及一个全局状态(保证线程安全)。方法的话,获取连接(多线程),以及释放连接(单线程)。以及相关的构造函数。...

2022-06-16 15:42:54 187

原创 线程学习(27)-不可变类

什么是不可变类?不可变类为什么是线程安全的?如果一个对象在不能修改其内部状态时,就代表了当前类不会存在对内部属性进行写的情况,也就是说它是线程安全的。因为我们平时接触的线程不安全,都是在多个线程进行操作时,并发对内部元素进行修改,发生了指令交错,最后这个内部元素被修改的出现了问题。而不可变类,之所以不可变,是因为内部元素或者类,或者方法都设置为final类型,就拿属性举例,final修饰了,基础类型就不可能发生并发修改的情况。而引用类型,虽然可能会改变final所修饰对象的成员变量。但是在不可变类中,

2022-06-16 15:25:08 235

原创 线程学习(26)-Atomic原子类型系列

因为在之前的学习中,也学到了多个线程安全的方法组合到一块却不是线程安全的。如果采用synchronized这种方式,锁比较重。所以提供一系列的基于CAS的组合方法类的API,来用以保证线程安全。在jdk1.8的文档里,这三种类型的方法基本上都是类似的。源码的底层都是do{}While()循环调用CAS方法完成操作。AtomicReference底层是一个泛型结构,底层使用==来保证compareAndSet中的compare,所以可以搭配一些不可变类来进行使用。比如String,BigInteger,

2022-06-16 14:54:52 656

原创 线程学习(25)-乐观锁方式CAS简介

原先所学的加锁,例如synchronized,ReetrantLock这些加锁方式都是悲观锁,即当前线程对加锁的内容进行操作时,其它的线程只能等待该线程锁住的内容执行完成之后,才可以获得锁,最终执行自己的业务。而今天所学的cas,是一种乐观锁的机制。cas,全拼是compare and set,即先比较后赋值(cas是个原子操作)。即当线程修改共享变量的时候,并不会像悲观锁一样,控制着不让其它线程修改当前变量,可以这么理解:1.线程A先获取到了主存值1,拷贝至工作内存2.线程B获取到主存值1,拷贝至工作内存

2022-06-12 18:20:40 979 3

原创 线程学习(23)-happen-before原则

happens-before 规定了对共享变量的写操作对其它线程的读操作可见,它是可见性与有序性的一套规则总结,抛开以下 happens-before 规则,JMM 并不能保证一个线程对共享变量的写,对于其它线程对该共享变量的读可见。(可以理解为先于什么发生)线程解锁 m 之前对变量的写,对于接下来对 m 加锁的其它线程对该变量的读可见 线程对 volatile 变量的写,对接下来其它线程对该变量的读可见 线程 start 前对变量的写,对该线程开始后对该变量的读可见 线程结束前对变量的写,对其它线程

2022-06-11 15:32:05 60

原创 线程学习(22)-dcl(double-checked locking)

double-checked locking,即dcl,代表多重校验锁。一听这个名字,就会想到双重校验锁单例模式,以及前面所说的犹豫模式。下面先写个正确的单例。上面的代码是一个完整的双重校验锁。第一个if防止每次试图创建对象时,都需要进入synchronized中进行判断。第二个if防止多线程剑发生指令交错,最终导致创建出多个对象。volatile代表了防止创建对象时发生指令重排,最终出现问题。原因写在注释上了。这里主要就着volatile来分析一下。javap反编译的指令集 17代表创建对象,对象引

2022-06-11 11:44:50 161

原创 线程学习(21)-volatile有序性

volatile保证了有序性。这里的有序性,不是前面所说的指令交错的问题,而是指令中更底层的东西。JVM在不影响正确性的情况下,会对语句的执行顺序来进行重排。为了提高指令执行的效率。Clock Cycle Time主频的概念大家接触的比较多,而 CPU 的 Clock Cycle Time(时钟周期时间),等于主频的倒数,意思是 CPU 能够识别的最小时间单位,比如说 4G 主频的 CPU 的 Clock Cycle Time 就是 0.25 ns,作为对比,我们墙上挂钟的Cycle Time 是 1s

2022-06-11 10:42:04 689 1

原创 线程学习(21)-volatile可见性

线程的三大特性主要划分为原子性,可见性,有序性。在原先的synchronized学习中,涉及到的大多是原子性,现在记录下可见性。JMM,即Java Memory Model,java内存模型,定义了主存,工作内存等一系列抽象概念,底层对应着CPU寄存器,缓存,硬件内存,CPU指令优化等。现在从抽象概念来进行理解,主存,还有工作内存,最终理解可见性。结果是这样的。 很明显没有执行完成。把volatile的注释解开,注释掉原有定义,结果是这样的。造成这种现象的原因是什么,从主存,工作内存的角度来进行理解。

2022-06-10 17:01:44 525

原创 线程学习(20)-使用多线程间隔打印字符串

假设我现在有三个字符串,abcdefg,1234567,!@#$%^&,我期望使用多线程来进行打印,打印的结果为a1!b2@c3#d4$e5%f6^g7&。这也是道面试题。有三种方案,synchronized,ReentrantLock结合Condition,LockSupport的park,unpark方法三种。这个题的思路是要做什么,使用多线程,并且控制执行线程的执行顺序,来完成对结果的打印。控制线程执行顺序,肯定要用到线程的通信机制。synhronized中配合锁对象中的wait()以及notify,

2022-06-01 00:48:36 271

原创 线程学习(19)-ReentrantLock基础

终于写到这了,记录下ReentrantLock的特性。ReetentLock与Synchronized的特点比较:ReetentLock支持zhon

2022-05-31 19:02:24 1199

原创 【无标题】线程学习(18)-多把锁下的线程问题,死锁,活锁,饥饿

多把锁的应用减小锁粒度,提交并发度。package com.bo.threadstudy.four;import lombok.extern.slf4j.Slf4j;/** * 多把锁的情况,以及后期的死锁,活锁,饥饿现象,哲学家就餐 */@Slf4jpublic class ManyLockTest { private static final Object lock1 = new Object(); private static final Object l

2022-05-30 18:25:14 123

原创 线程学习(17)park,unpark

个人笔记,勿喷

2022-05-30 11:08:46 2952

原创 线程学习(16)-生产者消费者

定义与前面的保护性暂停中的 GuardObject 不同,不需要产生结果和消费结果的线程一一对应消费队列可以用来平衡生产和消费的线程资源生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据JDK 中各种阻塞队列,采用的就是这种模式有点类似MQ的模式,这个直接写代码吧。重复消费等乱七八糟的现象就不考虑了。package com.bo.threadstudy.four;import lombo...

2022-05-30 00:45:35 74

原创 线程学习(15)-保护性暂停模式

保护性暂停是什么?定义即 Guarded Suspension,用在一个线程等待另一个线程的执行结果要点有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)JDK 中,join 的实现、Future 的实现,采用的就是此模式因为要等待另一方的结果,因此归类到同步模式普通方式package com.bo.threadstudy.four;import lom.

2022-05-29 22:59:35 127

原创 线程学习(14)-wait notify notifyAll

简介wait ,notify,notifyAll和原先学习的方法不同,这些是Object类中的方法,为什么是Object类中的方法,而不定义成线程中的方法。当时面试的时候,面试官问了个这问题。网上找一下标准答案。wait与notify,notifyAll是不仅是普通方法与同步机制,还是java两个线程中的通信机制。因为该通信机制与synchronized绑定,又需要保证对所有对象可用,所以放到Object中比较好。每个对象都可以上锁,这也就是放到Object中,而不是放到Thread类中的原

2022-05-28 23:04:59 347 1

原创 线程学习(13)-偏向锁

轻量级锁升级重量级锁,这块的内容总算是捋明白了,只要存在阻塞状态,那么肯定就是重量级锁了。必定和monitor对象中的waitSet以及entryList所相关。偏向锁,我上次写的代码中,看到了无锁,轻量级锁,重量级锁。但是却没有看到偏向锁。偏向锁其实是最常见的锁。下面说一下。偏向锁状态偏向锁其实默认就开启着,对象创建的时候,其实也应该是偏向锁状态。但是,就我上次所写的代码,默认情况下是无锁normal。问题何在?因为偏向锁的加载是一个延迟加载的过程,不会在程序启动时,立刻加载。如果想加载,

2022-05-28 17:14:03 691

原创 线程学习(12)-锁膨胀

锁膨胀其实就是锁升级的过程,从偏离锁升级为轻量级锁,以及从轻量级锁升级成重量级锁的过程。这里以从轻量级锁升级成重量级锁的过程直接上代码吧。轻量级锁升级成重量级锁的过程过程。package com.bo.threadstudy.four;import lombok.extern.slf4j.Slf4j;import org.openjdk.jol.info.ClassLayout;import java.util.concurrent.locks.LockSupport;/** *

2022-05-26 18:46:25 646

原创 线程学习(11)-轻量级锁

上一节,就着montior把重量级锁的内容写了一下,这节写一下轻量级锁。轻量级锁与重量级锁场景首先按场景划分一下:1.使用重量级锁的场景,在一个线程持有锁资源来正在进行业务操作时,另有其它线程在操作未执行完成时去竞争当前锁资源,使用重量级锁。(锁膨胀,后期说一下)。2.使用轻量级锁的场景,在一个线程执行完成之后,释放了锁资源,此时另外的线程在这个线程结束后获取到释放的锁资源来进行操作时,使用了轻量级锁。(从偏向锁升级为轻量级锁)。3.使用偏向锁的场景,这个也说一下吧。在一个线程执行完成后

2022-05-26 16:42:22 447

原创 线程学习(10)-monitor

synchronized加锁操作时,是monitor在底层操作系统中完成了重量级锁的加锁操作,主要是通过了monitorEnter以及monitorExit完成这个操作的。那么synchronized与monitor是怎么关联的呢?先带个疑问。Java对象头简介以32位机器为例:在对象头中,普通对象的对象头包含Mark Word,Klass Word,而数组对象多了一个array length。Mark Word,在不同的状态下记录了不同的内容,后续会一一介绍。Klass wor

2022-05-26 11:35:06 680

原创 线程学习(9)- 卖票代码与转账代码

多线程在考虑线程安全时,一定要考虑临界区,即被多个线程所共享的变量,在多线程种是否发生了读写操作,如果发生了,就可能会出现线程安全问题,需要保证线程安全。卖票问题卖票问题代码如下:package com.bo.threadstudy.two;import lombok.extern.slf4j.Slf4j;import java.util.*;/** * 卖票方法的测试类,首先需要一个票站,多个窗口卖票通过这个票站对象执行 */@Slf4jpublic class Se

2022-05-24 19:46:41 193

空空如也

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

TA关注的人

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