自定义博客皮肤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)
  • 收藏
  • 关注

原创 与spring整合后的mybatis

由 MapperFactoryBean创建Mapper代理对象,在Mapper代理对象中执行sqlSession的执行方法。其实这个sqlSession是一个实现了SqlSession接口的SqlSessionTemplate,在MapperFactoryBean创建后被装配。在SqlSessionTemplate中,有一个叫sqlSessionProxy的代理sqlSession,在创建SqlSessionTemplate的构造方法中被反射创建,反射处理器为SqlSessionInterceptor。

2020-05-22 15:25:06 197

原创 java生成验证码,字母或数学表达式及表达式计算

看看效果public static void main(String[] args) throws Exception { //字母数字验证码 Map map = CodeUtil.generateCodeAndPic(); OutputStream outputStream = new FileOutputStream("C:\\Users...

2020-04-07 02:59:09 466 1

原创 java实现简单计算器,支持整数计算、小数计算和精确计算,支持正负数

为了使用简单数学表达式做验证码,就要计算生成的表达式的计算结果,就去看了下数学表达式计算的方法。本来只计算简单的整型加减法的,但是最后整理了下,能计算小数。核心算法:以整数计算为例public Integer calculate(String[] expr) throws IllegalOperandException { Stack<Integer> n...

2020-04-07 00:18:15 1798

原创 JDK6 synchronize锁的优化

自适应自旋锁在共享数据持有时间较短的时候,切换线程开销不值得,通过循环等待锁释放,不让出CPU资源。锁的自旋次数不固定,由前一次在同一个锁上的自旋时间及锁的持有者状态,也就是成功率来确定自旋次数,达到自旋次数还未获取锁就进入阻塞。适应自旋锁会根据自旋获取锁的成功率来调整自旋次数,如果获取锁成功率高会调高自旋次数,否则反之。锁消除JIT编译时,对运行上下文扫描,去除不可能存在竞争的锁...

2020-03-09 15:10:30 250

原创 java中如何中断线程

如何中断线程1、另外线程调用此线程对象的interrupt()方法,通知线程应该中断了。(1)果线程处于阻塞状态(sleep、wait、join),那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。(2)处于正常活动状态,那么会将该线程的中断标记设置为true。被设置中断标志的线程将继续正常运行,不受影响。2、需要被调用的线程配合响应中断,正常运...

2020-03-08 11:16:22 158

原创 关于Thread.yield()

关于Thread.yield()1. 提示线程调度器表示当前线程可以让出 CPU, 但是调度器可能选择忽略。2. yield 不会改变当前同步锁的状态。

2020-03-08 10:25:40 206

原创 Thread的start()和run()方法区别

Thread的run和start的区别1.startstart()方法会调用原生JVM_StartThread方法,去创建一个子线程(thread-entity)并通过ThreadRun方法去调用run方法。2.run()方法只是Thread的一个普通的方法调用。...

2020-03-07 10:18:40 105

原创 java中的强引用、软引用、弱引用、虚引用

强引用普通的new一个对象比如,Object obj = new Object(),obj就是强引用,一个对象只要被强引用指向,那么这个对象就不会被回收。软引用软引用相对强引用要弱化一些,当对象有弱引用而无强引用关联时,当内存空间足够的时候,垃圾回收器不会回收它。适合用在缓存的应用场景中,如果内存充足,则可以缓存业务数据,如果内存不够则可以将其指向的对象回收。弱引用在垃圾回收时...

2020-03-06 01:29:31 178

原创 对象的finalize()方法作用是什么

Object的finalize()方法的作用是什么?答:finalize()的作用是为对象创造最后一次逃脱死亡的机会。当垃圾回收器宣告一个对象死亡时,至少要经过两次的标记过程,如果对象在进行可达性分析后,发现对象该没有和GC Roots相连接的引用链,就会被第一次标记,并且判断是否执行finalize()方法,如果对象覆盖finalize()方法且未被引用过,这个对象就会被放置在F-Queue...

2020-03-06 00:25:35 2530

原创 java常见垃圾收集器

一、垃圾回收相关理论Stop-The-Word(STW):JVM要执行GC而停止应用程序的运行,STW会在任何一种GC算法中发生,除了GC线程之外所有线程都处于等待状态,多数GC优化通过减少STW的时间来提升系统吞吐量。Safepoint(安全点):分析对象引用关系的时候,所有线程在这个点被冻结,不可以出现对象引用关系还在变化的情况,分析结果要在某个节点有确定性,该节点叫做安全点。产生安全...

2020-03-05 19:46:04 144

原创 java垃圾回收算法

垃圾标记算法要回收垃圾,则要知道哪些是垃圾引用计数算法(判断对象的引用数量,每个对象实例都有一个引用计数器,被引用+1、完成引用-1) 优点:执行效率高,程序执行受影响较小 缺点:无法检测出循环引用的情况,导致内存泄漏可达性分析算法(判断对象的引用链是否可达来决定对象是否可以被回收) 可以作为g...

2020-03-05 10:40:12 139

原创 forName已经完成初始化,那么为什么还要用loadClass呢?

有些情况是只需要知道这个类的存在而不需要初始化的情况使用Classloder.loaderClass,如springIOC懒加载,而有些时候又必须执行初始化就选择Class.forName,比如JDBC注册驱动。Driver在static块中会注册自己到java.sql.DriverManager。而static块就是在Class的初始化中被执行。package com.mysql.cj...

2020-03-04 10:59:11 210

原创 类加载过程及forName()和loadClass()的区别

类加载过程:1.加载:通过ClassLoader加载class文件字节码,生成Class对象。2.链接:校验:检查加载的class的正确性和安全性。 准备:为类变量分配存储空间并设置类变量初始值。 解析:jvm将常量池内的符号引用转换为直接引用。3.初始化:执行类变量赋值和静态代码块。区别:loadClass只执行到“...

2020-03-04 10:30:41 150

原创 (含完整项目)springboot+webuploader+mysql实现大文件分片、可以关掉浏览器的断点上传、秒传

完整项目在此:https://github.com/NoonLoveSnow/bigfileupload.git先说下为什么用数据库记录文件分片,因为文件分片可能不会存储在本机上,用数据库可以记录分片存储位置,方便获取。。合并后的文件也可以记录其md5值,作为真实文件,用户文件可以只需要新建表引用它就行了。大文件传输主要注意的有以下几点:大文件传输要求:大文件传输往往是比较耗时的,...

2020-01-16 17:14:08 773 2

原创 java重写和重载要求

重写:重写方法的方法名称、参数列表必须与原方法的相同返回类型可以相同也可以是原类型的子类型方法访问权限不能被缩小static和final方法不可以被重写private方法不能被重写,否则算重载重写方法不能抛出比被重写方法更高层次的被检查异常。可以有多个异常,重写的方法可以抛出任何运行期异常重载:方法名称必须相同参数列表必须不同(个数不同、或类型不同、参数类型排列...

2020-01-12 01:55:23 664

原创 java web 根据video标签进度条位置传输视频流 +下载文件实现断点续传

视频断点播放:<video id="player" src="video" controls="true" preload="auto" loop="loop" style="margin-left:9px" />标签播放视频,会在请求头部添加Range字段。这个字段格式一般格式为 Range:(bytes=first byte pos)-[last byte pos...

2019-12-21 00:33:33 2300 2

原创 超好用的两行java代码能获取几乎所有文件的contentType,返回前端能在浏览器上直接打开

String contentType;Path path = Paths.get(fileFullPath);//fileFullPath为文件路径(String)contentType = Files.probeContentType(path); response.setContentType(contentType);response.setHeader("Content-Disp...

2019-12-20 21:53:44 3487

原创 springboot集成qq第三方登录及获取用户信息(无自己封装的工具都写在controller里了超级易懂)

申请网站应用并不用多说了,下面是我应用的平台信息:整个代码流程是这样的:1.用户在login.html页面点击qq登录图标,浏览器访问我们Controller的/qqOauth2.我们的服务器向浏览器发送重定向到qq后台浏览器访问qq后台:"https://graph.qq.com/oauth2.0/authorize" + "?response_type=c...

2019-12-19 19:04:55 585

转载 JDBC为什么破坏双亲委派模型

详细见原文https://www.cnblogs.com/yueshutong/p/11430885.html讲得非常详细,找了很多文章,就这篇讲的非常清楚,所以总结一下简单来说DriverManager位于 $JAVA_HOME中jre/lib/rt.jar 包,由BootStrap类加载器加载,而其Driver接口的实现类是位于服务商提供的 Jar 包,根据类加载机制,当被装载的...

2019-12-10 01:42:02 757 1

原创 JVM运行时数据区

JVM运行时数据区和虚拟机内存模型运行时数据区:程序计数器,java虚拟机栈,本地方法栈,java堆,方法区。其中红色为线程隔离的数据区,蓝色为线程共享的数据区。方法区还包括:运行时常量池。虚拟机内存模型:程序计数器,java虚拟机栈,本地方法栈,java堆,方法区,运行时常量池,直接内存。直接内存不属于运行时数据区。程序计数器内存空间小,字节码解释器工作时通过改变这...

2019-12-09 23:25:08 155 2

原创 apache commons pool2简单使用,池化elasticsearch RestHighLevelClient

ESRestHighLevelClientPoolFactory.java工厂类,实现pooledObjectFactory:package ElasticsearchRestHighLevelClientPool;import org.apache.commons.pool2.PooledObject;import org.apache.commons.pool2.PooledOb...

2019-11-05 21:06:12 897

原创 InputStreamReader、OutputStreamWriter读写中的中文编码问题、带bom的文本文件

一、简单说下bombom是Unicode编码标准中用于标识文件是采用哪种格式的编码,是文件头部的几个字节。阅读器可根据bom来确定以哪种编码来打开文件。常见编码的bom: 编码 表示 (十六进制) 表示 (十进制) UTF-8 EF BB BF 239 187 191 ...

2019-11-04 22:37:49 776

原创 线程间通信之管道流(PipedInputStream、PipedOutputStream)

下面是用文件输入输出流配合管道输入输出流完成文件复制的功能。发送方:文件输入流读数据到管道输出流。接收方:管道输入流读数据到文件输出流。package pipedCommunication;import java.io.*;public class Demo { //发送线程 static class Sender implements Runnable {...

2019-11-03 22:06:18 458

原创 线程间通信之生产者消费者模型(notify()、notifyAll()的区别、多个生产者消费者比较分析)

锁池(entrySet):  假设线程A已经拥有对象锁,线程B、C想要获取锁就会被阻塞(blocked),进入一个地方去等待锁的等待,这个地方就是该对象的锁池;等待池(waitSet):  假设线程A调用某个对象的wait方法,线程A就会释放该对象锁,同时线程A进入该对象的等待池中,状态为waiting,进入等待池中的线程不会去竞争该对象的锁。另外线程调用对象notify(...

2019-11-03 18:00:49 272 1

原创 StampLock使用(乐观读,锁升级)

package stamplock;import java.util.concurrent.locks.StampedLock;/** * 所有获取锁的方法,都返回一个邮戳(Stamp),Stamp为0表示获取失败,其余都表示成功; * 所有释放锁的方法,都需要一个邮戳(Stamp),这个Stamp必须是和成功获取锁时得到的Stamp一致; * StampedLock是不可重入的;...

2019-11-03 14:01:54 1292

原创 关于锁降级(ReentrantReadWriteLock)

锁降级:线程获取写锁后,在释放写锁之前获取读锁,然后再释放写锁,这样就实现了锁降级的特性。注意:线程获取读锁后,写锁不会释放,需要显示的释放,在ReentrantReadWriteLock中,不存在锁的升级。锁降级应用场景: 对于数据比较敏感, 需要在对数据修改以后, 获取到修改后的值, 并进行接下来的其它操作。package xxx;import java.util.concu...

2019-11-01 17:11:42 269

原创 ReentrantLock公平锁与非公平锁的区别

1、在公平实现中,sync为FairSync,其lock()方法与NonfairSync相比,少了抢占的步骤:NonfairSync中的lock():final void lock() { if (compareAndSetState(0, 1))//抢占 setExclusiveOwnerThread(Thread.currentT...

2019-10-31 17:17:43 205

原创 ReentrantLock之非公平锁的实现

Lock接口、ReentrantLock、Sync、FairSync、NonFairSync、AbstractQueuedSynchronizer(AQS)的关系:ReentrantLock实现了Lock接口;Sync是ReentrantLock中的一个内部抽象类、继承了AQS;FairSync和NonfairSync都是ReentrantLock中的内部类,都继承了Sync,并且实现了S...

2019-10-31 10:57:52 390

原创 用ReentrantLock、Condition实现三个线程的for循环交替打印

好记性不如烂笔头,在此记下Reentrant与Condition配合使用的一般方法。有三个线程tA、tB、tC,当i为1时线程tA打印,当i为2时线程B打印,当i为3时线程C打印,并且这三个线程遵循tA唤醒tB,tB唤醒tC,tC唤醒tA的规则。package reentrantLockUsage;import java.util.concurrent.locks.Condition...

2019-10-30 17:45:04 1311

原创 实现Look接口,自定义锁简单实现(不可重入、可重入)

1、简单实现(不可重入)Lock的实现类:package mylock;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;public class MyLock implements Lo...

2019-10-30 15:25:39 535

原创 单例模式与线程安全(懒汉式、double check、volatile)

1.饿汉式单例饿汉式单例:在类加载的时候,就已经初始化,无论之后用没用到。这样写法简单,线程安全,但是占内存。值得注意的是构造方法必须私有。package Singleton;public class HungerSingleton { private static HungerSingleton singleton=new HungerSingleton(); p...

2019-10-29 20:30:00 448 1

原创 synchronize的几种用法

1.作用在普通方法上在这种情况下是对象锁,下面可以看到同一时刻只有一个线程能进入demo对象的increase()方法。要进入synchronized修饰的普通方法,就要获取当前对象(demo)的锁。这种方式仅适用于单例模式。Demo类:package sychronize_usage;public class Demo { volatile int count...

2019-10-29 18:19:03 2070

原创 线程的挂起和唤醒为什么不用suspend()和resume()

如果用suspend()方法将线程挂起,线程占有的资源不会被释放,很有可能让其他线程死锁。package Suspend;public class SuspendDemo implements Runnable { private static Object obj = new Object(); @Override public void run() {...

2019-10-29 16:42:19 348

原创 类加载

下面看两种单例:class Singleton1{ public static int count1; public static int count2=0; private static Singleton1 singleton=new Singleton1(); public static Singleton1 getInstance() { return single...

2019-09-25 23:14:14 98

原创 多线程debug

将断点设置为线程级别:

2019-09-07 21:40:14 98

原创 Java中自增操作的线程不安全性

首先上代码:开启10个线程,每个线程对i自增100次package demo1;public class demo1 { private static volatile int i=0; //volatile保证线程可见性 public static void iIncrease(){ i++; } public static void m...

2019-09-07 12:38:35 477

空空如也

空空如也

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

TA关注的人

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