
java
文章平均质量分 73
thetimelyrain
见微知著
展开
-
ThreadLocal内存泄露代码演示,和内存泄露原因分析
引发的内存泄漏分析预备知识引用Object o = new Object();这个o,我们可以称之为对象引用,而new Object()我们可以称之为在内存中产生了一个对象实例。当写下 o=null时,只是表示o不再指向堆中object的对象实例,不代表这个对象实例不存在了。强引用一直活着:类似“Object obj=new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象实例。软引用有一次活的机会:软引用关联着的对象,在系统将要发生内转载 2021-10-02 17:30:54 · 812 阅读 · 0 评论 -
值大小相同的Integer和Long为什么hashCode值一样
关于Interger和Long的hashCode方法源码 /** * Returns a hash code for this <code>Integer</code>. * * @return a hash code value for this object, equal to the * primitive <code>int</code> value represented by原创 2021-03-30 17:45:53 · 521 阅读 · 0 评论 -
linux系统执行.java文件
如图,一个简单的Java程序,要把它丢到linux里面执行:package OOM;public class UnableCreateNewThreadDemo { public static void main(String[] args) { for (int i = 0; ; i++) { System.out.println("******** i = " + i); new Thread(() -> {原创 2021-03-23 14:40:29 · 840 阅读 · 0 评论 -
并发编程之AQS中的CLH队列
CLH队列在AQS类文件的开头,作者添加了很长一段注释,向开发者解释CLH队列,以及AQS对CLH队列的使用。AQS里面的CLH队列是CLH同步锁的一种变形。其主要从两方面进行了改造:节点的结构与节点等待机制。在结构上,AQS类引入了头结点和尾节点,他们分别指向队列的头和尾,尝试获取锁、入队列、释放锁等实现都与头尾节点相关:To enqueue into a CLH lock, you atomically splice it in as new tail. To dequeue, you jus原创 2021-03-10 16:22:38 · 1360 阅读 · 0 评论 -
DB主从一致性架构优化4种方法
需求缘起大部分互联网的业务都是“读多写少”的场景,数据库层面,读性能往往成为瓶颈。如下图:业界通常采用“一主多从,读写分离,冗余多个读库”的数据库架构来提升数据库的读性能。这种架构的一个潜在缺点是,业务方有可能读取到并不是最新的旧数据:(1)系统先对DB-master进行了一个写操作,写主库(2)很短的时间内并发进行了一个读操作,读从库,此时主从同步没有完成,故读取到了一个旧数据(3)主从同步完成有没有办法解决或者缓解这类“由于主从延时导致读取到旧数据”的问题呢,这是本文要.转载 2021-01-21 17:14:58 · 227 阅读 · 0 评论 -
springAOP的基础术语,带图
面向切面编程( aspect-oriented programming , AOP )允许你把遍布应用各处的功能分离出来形成可重用的组件。原创 2020-12-07 14:42:21 · 368 阅读 · 0 评论 -
java异常中try,catch,finally中和return返回之间的顺序和影响
目录1.走try块中的return2.走catch块中的return3.走finally块中的returnjava的异常捕捉的标准格式是try...catch...finally块,那么我们在与return结合的时候,返回值是如何确定的呢?1.走try块中的returnpublic class tryDemo { public static int show() { int b = 20; try { System.o原创 2020-11-19 16:13:46 · 345 阅读 · 0 评论 -
java使用try-with-resources语句优雅的关闭资源
在Java编程过程中,如果打开了外部资源(文件、数据库连接、网络连接等),我们必须在这些外部资源使用完毕后,手动关闭它们。因为外部资源不由JVM管理,无法享用JVM的垃圾回收机制,如果我们不在编程时确保在正确的时机关闭外部资源,就会导致外部资源泄露,紧接着就会出现文件被异常占用,数据库连接过多导致连接池溢出等诸多很严重的问题。在java1.7以前,我们关闭资源的方式如下:public class CloseTest { public static void main(String[] ar原创 2020-09-18 15:35:45 · 7603 阅读 · 0 评论 -
java8的时间函数
学习时间函数,我们先直接学习api。java8在线api:https://www.matools.com/api/java8先贴图:我们使用的时间函数,大部分都是出自于java.time这个包下,从Clock到ZoneOffset,基本上都是时间类型的抽象,而我们经常使用到的就是我圈起来的两个类。LocalDate和LocalDateTime。看api就知道,LocalDate只包含年月日,不包含时分秒,LocalDateTime可以到具体的时分秒。下面就使用LocalDateT原创 2020-09-17 16:12:50 · 1655 阅读 · 0 评论 -
java的try后面跟括号
如题,在工作中遇见了在try...catch语句的try后面加括号,不懂,查资料明白之后,特此记录.下面是一段很简单的从文件读取文本的输入流:package com.springcloud.server.springserver;import java.io.*;public class TryTest { public static void main(String[] args) { File file = new File("E:\\springcloud\\原创 2020-07-01 14:25:05 · 6365 阅读 · 0 评论 -
pom文件排除jar包冲突
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.11</ve...原创 2020-05-07 23:27:42 · 5473 阅读 · 0 评论 -
曲线救国使用内部类实现"多重继承"
为什么需要内部类:每个内部类都能独立的继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响.如果使用的是抽象的类或者具体的类,而不是接口,那就只能使用内部类才能实现多重继承.https://blog.youkuaiyun.com/litaosdau/article/details/38758587如果不需要解决"多重继承"的问题,那么可以使用别的...原创 2020-04-23 23:20:32 · 187 阅读 · 0 评论 -
java的泛型擦除机制
java编程思想在泛型里面描述道:在泛型代码内部,无法获取任何有关泛型参数类型的信息.public class Test { public static void main(String[] args) { Class c1 = new ArrayList<String>().getClass(); Class c2 = new Ar...原创 2020-11-20 17:55:37 · 996 阅读 · 0 评论 -
内部类之.this和.new
如果你需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟着圆点和this.这样产生的引用自动地具有正确的类型,这一点在编译期间就被知晓并受到检查,因此没有任何运行时期的开销.有时你可能想告知某些其他对象,去创建某个内部类的对象,要实现此目的,你必须在new表达式中提供对其他外部类对象的引用,这需要圆点和new语法.创建内部类的两种方法:1.在外部类中创建一个方法,该方...原创 2020-04-23 22:56:41 · 371 阅读 · 0 评论 -
java构造器,成员变量,静态属性,静态代码块在继承中的调用顺序
初始化顺序:静态属性->静态代码块->成员属性->构造方法(先调用父类的构造方法)原创 2020-04-15 23:54:09 · 303 阅读 · 0 评论 -
Class中的getClasses与getDeclaredClasses方法作用于区别
https://www.cnblogs.com/leodaxin/p/9594071.html原创 2020-04-15 23:22:38 · 1189 阅读 · 0 评论 -
final修饰的变量能否被反射所修改
结论:当定义为基本数据类型的数据和String的时候,只要赋值的时候右边是常量表达式,就会进行编译器的优化.只要不会被编译器内联优化的final属性就可以通过反射进行有效的修改https://blog.youkuaiyun.com/guohengcook/article/details/81264746?depth_1-utm_source=distribute.pc_relevant...原创 2020-04-15 23:12:22 · 2042 阅读 · 0 评论 -
byte的+=和直接相加的区别
byte a = 127;a +=1;System.out.println(a); //a = -128原创 2020-04-14 23:59:46 · 1684 阅读 · 0 评论 -
java的protected关键字详解
关于protected关键字:java编程思想里面解释道:关键字protected指明:就类用户而言,这是private的,但对于任何继承于此类的导出类或其他任何位于同一个包内的类来说,它确是可以访问的.这句话有两层含义:1.父类的protected成员是包内可见的,并且对子类可见;2.若子类与父类不在同一个包内,那么在子类中,子类实例可以访问其从父类继承而来的protec...原创 2020-04-22 00:00:42 · 5534 阅读 · 1 评论 -
java里面的悲观锁和乐观锁
最近面试,面试官提到了悲观锁和乐观锁,感觉回答的不是很好,特此总结记录.简单来说,悲观锁就是凡事都认为会出现最坏的情形,而乐观锁就是认为凡事都以最好的情形发展,对应一个消极,一个积极.悲观锁具有强烈的独占和排他特性。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态.(摘自百度百科)传统关系型数据库里面...原创 2019-09-18 11:28:32 · 7297 阅读 · 1 评论 -
java里面的公平锁和非公平锁
java里面的线程加锁机制有两种方式,一种是使用synchronize关键字修饰代码块或者方法,另外一种是jdk1.5以后在juc包下实现的lock锁机制,本文讨论的主要是juc包下面的重入锁ReentrantLock.实现方式:公平锁:Lock lock = new ReentrantLock (true);非公平锁Lock lock = new ReentrantLock ()...原创 2019-09-18 15:40:25 · 446 阅读 · 0 评论 -
spring装配bean的三种机制总结
创建应用对象之间协作关系的行为通常称为装配( wiring ),这也是依赖注入( DI )的本质。配置 Spring 容器最常见的有三种方法:1. 在 XML 中进行显式配置;2. 在 Java 中进行显式配置;3. 隐式的 bean 发现机制和自动装配;Spring 从两个角度来实现自动化装配:组件扫描( component scanning ): Spring 会自动发现应用上下...原创 2019-07-21 23:03:41 · 491 阅读 · 0 评论 -
java代理模式之jdk动态代理详解(超详细)
代理模式:代理是基本的设计模式之一,它为你提供额外的或者不同的操作,而插入的用来代理"实际"对象的对象.这些操作通常涉及与"实际"对象的通信,因此代理通常充当着中间人的角色.动态代理动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象.动态代理的优点:职责清晰真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简...原创 2019-07-18 01:05:04 · 3001 阅读 · 0 评论 -
Failed to instantiate [org.springframework.aop.aspectj.AspectJExpressionPointcut]: No default constr
在学习spring in action AOP第四版书籍的时候报错:警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean wi...原创 2019-07-19 23:08:31 · 2556 阅读 · 2 评论 -
java代理模式之静态代理
代理模式:代理是基本的设计模式之一,它为你提供额外的或者不同的操作,而插入的用来代理"实际"对象的对象.这些操作通常涉及与"实际"对象的通信,因此代理通常充当着中间人的角色.静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。下面是进行演示的代码:首先是代理类的接口://抽象角色 ...原创 2019-07-17 00:30:12 · 113 阅读 · 0 评论 -
java观察者模式之jdk的Observerable的实现
概念:观察者模式:观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。–>以松耦合的方式在一系列对象之间沟通状态。上一篇文章用自定义的代码进行了观察者模式的实现,这一篇文章主要讲解jdk的实现方式,并探究此模式在jdk中实现的优缺点:业务场景:有一个气象观测站,能够检测具体的气象数据,如温度,湿度和气压,现在有三个具体的显示面...原创 2019-07-24 01:19:57 · 576 阅读 · 0 评论 -
设计模式之观察者模式
观察者模式:观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。–>以松耦合的方式在一系列对象之间沟通状态。下面介绍需要了解的概念:抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。具体主题(Concrete Subject...原创 2019-07-24 00:21:09 · 365 阅读 · 0 评论 -
idea鼠标变粗无法使用
如图所示,在某次不小心操作之后,idea界面鼠标变化:此时,只需要将键盘的insert键按一次即可变回来,原创 2019-04-09 22:34:29 · 1120 阅读 · 1 评论 -
线程池拒绝策略及代码演示
线程池:为了避免重复的创建线程,线程池的出现可以让线程进行复用。当有任务提交的时候,就会向线程池拿一个线程,当任务完成后,并不是直接关闭线程,而是将这个线程归还给线程池供其他任务使用。这样就可以避免频繁的创建线程而带来的不必要的性能开销.使用线程池:在java1.5版本以后,使用线程池建议使用java.util.concurrent包下的已经封装好了的三个静态方法:创建指定线程大小的线程...原创 2019-07-30 23:26:32 · 250 阅读 · 0 评论 -
idea前后跳转箭头
idea的前后跳转箭头没有像eclipse一样显示在导航栏,很多时候找不到,记住快捷键:ctrl+alt+ 向左箭头或者向右箭头即可跳转。原创 2019-07-26 00:19:39 · 4302 阅读 · 0 评论 -
关于String,StringBuilder和StringBuffer的简单比较
要知道三者之间的区别,就先看看其中的一些方法:首先是String:/** The value is used for character storage. */private final char value[];String里面维护了一个char类型的字符数组,并且使用了final关键字进行修饰,所以String对象是不可变的再来看下StringBuilder:public fin...原创 2019-08-20 23:53:32 · 86 阅读 · 0 评论 -
浅析hashmap的put()方法
最近面试的时候,有面试官问到hashmap的put()方法做了哪些事情,我觉得回答的不够好,特此好好研究下hashmap,并总结下.HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8 以后在...原创 2019-08-21 23:18:58 · 31855 阅读 · 6 评论 -
关于"=="和"equals()方法"的比较
1)对于==,比较的是值是否相等如果是基本数据类型,则比较的是其存储的"值"的大小是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是是否是同一个对象未重写的equals()方法: public boolean equals(Object obj) ...原创 2019-08-17 21:33:49 · 393 阅读 · 0 评论 -
mongodb简单的使用语法
MongoDB是一个NoSQL数据库,它是跨平台的,基于分布式文件存储的数据库,由C++语言编写的(这点很重要,则表示在Linux下需要安装gcc环境)。MongoDB是以文档的形式存储数据,数据结构由键值(key:value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。下面简单使用robo3t进行数据库的一些简单操作:1.创建数据库2.创...原创 2019-09-01 00:09:01 · 151 阅读 · 0 评论 -
java异常体系小结
java原创 2019-09-01 14:43:49 · 132 阅读 · 0 评论 -
使用springboot连接mongodb数据库并进行操作
本文主要指导以最简单的方式搭建一个以springboot整合swaggerUI并对mongodb数据库进行操作的demo,废话不对说,直接上流程:1.创建springboot工程2.添加swagger的pom依赖在pom文件里面加上需要导入的jar包:<dependency> <groupId>io.springfox</groupId> ...原创 2019-09-01 16:29:10 · 10451 阅读 · 3 评论 -
throws和throw的区别
java中抛出异常有三种方式:系统自动抛出的异常throwsthrow1.系统自动抛出public class test { public static void main(String[] args) { student p1 = new student(); System.out.println(p1.getName ().equals (...原创 2019-09-01 15:22:45 · 176 阅读 · 0 评论