Java
不骄不傲
低调人生,从不装逼
展开
-
IDEA的tomcat的web项目解决控制台中文乱码问题
IDEA解决中文乱码的问题原创 2022-09-21 09:43:09 · 330 阅读 · 1 评论 -
spring boot项目配置日志打印
springboot打印日志原创 2022-08-07 14:12:17 · 208 阅读 · 0 评论 -
Spring Boot项目整合FreeMarker模板引擎
Spring Boot项目整合FreeMarker模板引擎pom.xml文件中引入代码如下 ` <!-- 模板ftl --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31&原创 2021-05-15 23:23:10 · 167 阅读 · 1 评论 -
SpringBoot + Mybatis项目sql日志打印配置
我的SpringBoot是1.5版本,版本可以说很低。mybatis的sql日志打印配置很简单,在application.yml中加个代码即可;代码如下:logging: level: com.itheima.hchat.mapper: debug # 这是项目的mapper包路径把mapper文件所在的包路径写上即可。配置后的效果...原创 2021-05-10 23:12:50 · 199 阅读 · 0 评论 -
Spring Boot自动装配原理和源码
自动配置原理简单剖析从@SpringBootApplicaiton注解下手SpringBootApplication注解包含@EnableAutoConfiguration注解,字面意思启用自动配置EnableAutoConfiguration注解包含@Import注解且有一个class参数AutoConfigurationImportSelector.class紧接着进入AutoConfigurationImportSelector类的getAutoConfigurationEntry方法原创 2021-05-04 22:00:19 · 1231 阅读 · 11 评论 -
Java可重入读写锁ReentrantReadWriteLock之实战缓存
简介写一个简单的缓存读写锁demo, 基本操作set和get, set是写锁,get是读锁.反例没加读写锁前的程序执行public class ReadWriteLockDemo { public static void main(String[] args) { for (int i = 0; i < 5; i++) { final int temp = i; new Thread(()->{原创 2020-08-31 22:12:21 · 489 阅读 · 1 评论 -
Java中利用AtomicReference手写自旋锁Demo
自旋锁简介自旋锁是一种非阻塞锁,抢到执行权的线程并不会自旋,自旋的精髓在于没抢到执行权的线程,它们会空转cpu,一直循环,这就是自旋,并非把线程改为阻塞状态.它们还是在运行的,自旋重试想获取锁.源代码public class SpinLockDemo { public static AtomicReference<Thread> spinLock = new AtomicReference<>(); private static Integer count原创 2020-08-27 22:42:50 · 710 阅读 · 1 评论 -
Java中可重入锁synchronized,ReentrantLock简介
可重入锁即可以加锁多次,解锁也可以多次,且加锁解锁次数相抵消才行.synchronized和ReentrantLock都是可重入锁代码案例演示public class ReentrantLockDemo2 { private static ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) { new Thread(()->{原创 2020-08-27 21:37:05 · 233 阅读 · 0 评论 -
关于线程池任务管理,宕机了怎么处理没执行的线程
思路首先设计一张表,记录任务状态,执行时间,已执行,未执行等等其次任务来的时候写入表中,任务标识未执行如果此时有1000个任务都过来了,那么表中也有1000行记录接着JVM内存溢出OOM,程序挂了,未执行的任务就知道是哪些了.系统再次启动的时候,依次读取未执行的任务加入线程池中复盘,二次执行...原创 2020-08-25 22:34:20 · 1847 阅读 · 0 评论 -
简单介绍newFixedThreadPool线程池原理
实现原理底层是采用队列来存储进来的线程,如果工作队列满了无空闲工作线程,则加入队列阻塞,如果工作线程有空闲,则不用阻塞直接被执行.默认是一个无界队列int.MAX_VALUE这么大,如果请求过大会造成JVM内存OOM...原创 2020-08-25 22:10:53 · 635 阅读 · 0 评论 -
简单介绍AQS底层原理
AQS简介全称Abstract Queued Synchronizer, 抽象队列同步器,它是并发包中的基础类,比如ReentrantLock就基于AQS实现可重入锁AQS原理AQS中有state丶临界区线程丶等待队列三个重要部分组成其中线程去CAS更新state为1,更新成功的线程进入代码临界区,其它CAS更新失败的线程进入等待队列临界区线程释放锁后,唤醒等待队列线程.如果此时有其它线程进来CAS更新state为1,那么等待队列线程继续等待,这就是被插队,非公平锁,Java中ReentrantL原创 2020-08-25 21:51:54 · 791 阅读 · 0 评论 -
简单介绍synchronized底层原理
synchronized加锁方式大致三种锁对象锁this指针,当前对象锁类.classsynchronized的原理底层主要是有monitor对象,获取锁时判断标志位是否为0,为0则进入临界区对应的指令monitorenter,获得锁后标志位改为1,其它线程获取锁发现标志位1,进入阻塞状态,直到临界区线程出来是标志位-1变为0对应的指令monitorexit...原创 2020-08-25 21:21:09 · 164 阅读 · 0 评论 -
Java观察者(Observe)模式--项目实战应用
观察者模式简介我简单说一下, 理论知识网上有很多,我不细说了组成结构组要有Subject和Observe组成表结构 对象关系User对象和Article丶UserRecord有关联可以理解为User对象是主题Article丶UserRecord是订阅者运行结果User添加会通知Article和UserRecord去添加相应的数据User删除会通知Article和UserRecord去删除相应的数据总结观察者模式便于维护对象之间的依赖关系,保证数据的一致性优点即可扩展性和可维护原创 2020-08-25 13:39:07 · 351 阅读 · 0 评论 -
JDK动态代理使用及底层原理和源码
JDK动态代理步骤1.实现代理前需要实现一个接口的invoke方法即可2. 使用动态代理如下关键代码3.执行结果调试JDK动态代理源码首先进入newProxyInstance方法,719行代码是获取到代理对象的Classcom.sun.proxy包下的,而且类名有个0结尾,避免代理类重复,保持唯一ID紧接着跟进去719行代码的细节 Class<?> cl = getProxyClass0(loader, intfs);429行代码很关键,首先从缓存中找接口,找不到原创 2020-08-23 15:14:22 · 865 阅读 · 1 评论 -
Java手写简易spring ioc实战。
准备环境1.一个maven web工程2.引入dom4j依赖<dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.3</version> </dependency>3.创建一个spring.xml4.创建BeanFactory用于解析xml原创 2020-08-23 00:57:11 · 218 阅读 · 0 评论 -
Java手写动态代理,模拟动态代理,任意逻辑动态代理
实现思路1.字符串拼接生成一个Java文件2.用IO流输出到磁盘3.运行时编译4.执行动态代理自己写的动态代理只用于理解JDK动态代理的思想, 无其他用处, 目前可以实现任意逻辑的代理,执行前和执行后执行效果源代码:: 码云....原创 2020-08-22 11:59:11 · 107 阅读 · 0 评论 -
Windows IDEA中debug模式启动提示端口占用解决方案
抛出异常异常中提示1199端口被占用第一步打开cmd 输入命令: netstat -ano | findstr “1199”第二步打开任务管理器找到PID 8488的程序把它kill掉,根据PID升序显示,更好定位PID第三步 结束任务后,直接启动IDEA即可,完美解决...原创 2020-08-21 09:42:54 · 2191 阅读 · 1 评论 -
Java中公平锁和非公平锁各自的特点
公平锁公平锁对于线程来说是先请求先调度执行,即FIFO队列,队列头部第一个线程永远先执行,吞吐量不理想.例如Java中的ReentrantLock可以通过参数改为公平锁,默认是非公平锁.FairSync()实现类公平锁非公平锁非公平锁见名知意,并不是线程先请求就会先被执行,底层是采用某种机制可能是优先权抢占,短线程抢占,来抢锁,好处就是提高了系统的吞吐量,其中短线程抢占算法可能会导致长线程得不到执行产生"饥饿"现象,不过可以采用"老化技术"来解决饥饿问题.总结至于使用什么锁,是需要看使用场原创 2020-08-10 22:30:43 · 542 阅读 · 0 评论 -
Java并发HashMap报错ConcurrentModificationException解决方案
HashMapHashMap是散列表存储,采用key-value键值对存储数据,其中k用hash散列函数找到存储位置,为的就是减少查找比较次数,特点: 无序,key不可重复,key可以为null,value可重复,线程不安全.JDK1.7底层是采用数组+链表,hash碰撞后采用拉链法来解决碰撞问题.JDK1.8底层采用数组+链表+红黑树,链表长度大于等于8且容量大于等于64就会树化,否则会反树化.案例代码public class HashMapConcurrentDemo { public原创 2020-08-09 14:36:00 · 3124 阅读 · 0 评论 -
Java并发HashSet报错ConcurrentModificationException解决方案
HashSetHashSet特点: 元素不可重复,无序,线程不安全,底层是HashMap实现,HashMap的key是唯一不可重复的,value则是用的一个Object对象"占位",主要是key用来存取数据.案例代码public class HashSetConcurrentDemo { public static void main(String[] args) { Set<String> list = new HashSet(); for原创 2020-08-09 14:19:20 · 1715 阅读 · 0 评论 -
Java并发ArrayList报错ConcurrentModificationException解决方案
ArrayListArrayList是一个集合,特点: 有序,元素可重复,随机查找快,删除和插入较慢,线程不安全.默认10个容量大小,底层实现是一个数组和动态扩容技术,扩容时是当前容量的1.5倍,即10*150% = 15.案例代码public class ArrayListConcurrentDemo { public static void main(String[] args) { List<String> list = new ArrayList<原创 2020-08-09 13:58:12 · 535 阅读 · 0 评论 -
Java并发CAS之ABA问题
CAS锁有ABA问题因为CAS是乐观锁,只要预期值和当前值相同则可以修改成功,但是这会有个"ABA"问题.什么是"ABA"问题呢,我上段程序就知道了public class AtomicReferenceDemo { static AtomicReference<Integer> atomicReference = new AtomicReference<>(100); static AtomicStampedReference<Integer>原创 2020-08-08 22:14:47 · 163 阅读 · 0 评论 -
Java并发CAS原理
CAS(CompareAndSet)实现原理Unsafe类的支持自旋锁Unsafe类是什么?是CAS的核心类,Unsafe类是一个native方法,底层是C++语言实现的,Unsafe在Sun.misc包下,由此Java可以操作底层的内存,得以实现CAS的原子操作.原创 2020-08-08 21:09:32 · 149 阅读 · 0 评论 -
Java并发CAS基本功能
CAS简介CAS全程CompareAndSet,比较并交换,有一个期望值,和一个最终修改值,如果期望值不相等则修改失败,否则修改成功.CAS案例public class CompareAndSetDemo { static AtomicInteger atomicInteger = new AtomicInteger(6); public static void main(String[] args) { boolean b = atomicInteger.compa原创 2020-08-08 19:22:22 · 227 阅读 · 0 评论 -
Java内存模型之原子性
原子性原子性,不可分割,操作不能打断.比如人说一句话不被打断这就是原子性.程序也是执行某个操作被打断就会产生致命的错误.原子性反面案例class Data{ volatile int number=0; public void numberIncrement(){ this.number++; }}public class Main { public static void main(String[] args) { Data da原创 2020-08-08 12:33:47 · 234 阅读 · 0 评论 -
Java内存模型可见性之volatile(三)
上一篇文章说到了JMM可见性的案例 链接: Java内存模型之可见性(二).volatilevolatile关键字是可以保证线程间的可见性,线程间通信,可以认为是轻量级的synchronized.案例class Data{ volatile int number=0; public void addTo60(){ this.number = 60; }}public class Main { public static void main(Str原创 2020-08-08 11:48:07 · 108 阅读 · 0 评论 -
Java内存模型之可见性(二)
Java线程通信Java中线程和线程之间是没法通信的,也就是不可见性。class Data{ int number=0; public void addTo60(){ this.number = 60; }}public class Main { public static void main(String[] args) { Data data = new Data(); new Thread(()->{原创 2020-08-08 11:14:51 · 128 阅读 · 0 评论 -
Java内存模型(一)
JMM的特点1.可见性2.原子性3.有序性原创 2020-08-06 10:40:44 · 86 阅读 · 0 评论 -
Java分布式锁之ZooKeeper实现思路
ZooKeeper实现分布式锁思路实现思路分布式锁核心思路总结实现思路在分布式的场景中,保证线程安全并不是单机版JVM简单的lock,unlock就完事的,分布式锁是需要一台服务器来协调,多台JVM中都要访问临界资源是通过这台服务器保证有序性丶安全性,数据一致性.所以需要准备一台服务器装上ZooKeeper.分布式锁核心思路获取锁方法(lock)思路,在ZooKeeper中创建临时结点,一个会话结束后就删除结点,即创建结点成功=持有锁,会话结束=释放锁.如果某个JVM在ZooKeeper中拿到锁原创 2020-07-06 12:43:17 · 128 阅读 · 0 评论 -
IDEA配置Go语言Go1.5.1开发环境IDEA2020.1.1-Go语言自己动手写Java虚拟机 (Java核心技术系列)
大纲配置前置环境安装环境为什么要安装Go语言开发环境呢IDEA官网下载Go语言插件IDEA中安装下载好的Go语言插件安装完成总结配置前置环境需要安装Go语言环境,具体安装步骤我不贴图了,自行百度即可.链接: Go语言1.5.1下载地址.,为什么是1.5.1版本呢,因为书中是这个版本,所以没下载现在的最新版本.安装环境博主的 IDEA 2020.1.1, Go语言环境版本1.5.1在IDEA中下载go语言插件,建议去网页下载,为什么要安装Go语言开发环境呢最近闲来无事,作为一名热爱敲代码的原创 2020-06-28 13:31:21 · 2088 阅读 · 1 评论 -
Java包装类Integer之IntegerCache经典面试题
大纲一.IntegerCache类和Integer类的关系二.IntegerCache类的源码浏览三.Integer.valueOf()方法浏览四.经典面试题总结一.IntegerCache类和Integer类的关系IntegerCache是Integer类中私有静态内部类.如下图二.IntegerCache类的源码浏览IntegerCache类是干嘛的?从类名中看第一反应是缓存的效果?答案是肯定的,来看一下IntegerCache的源码private static class IntegerC原创 2020-06-24 15:30:02 · 411 阅读 · 0 评论 -
关于Java中内部类编译的问题
目录关于内部类编译的问题起因关于内部类编译的问题起因由于昨天发了一个增量更新包,今早就发来"喜报",说XX模块功能有问题,于是在下去生产排查后,发现是内部类的问题,在下心想可能是昨天增量包缺少类.Java中只能有一个public class 类,但是public class类内部可以有若干个public class类,就是所谓的内部类.如下代码中有两个内部类 Consumer和Providerpublic class VoucherConsumerThread { private Vouc原创 2020-06-23 13:13:06 · 808 阅读 · 0 评论