自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 记一次log4j配置

1 写在开头今天接手的一个古董接口程序报了异常,找服务器维护人员拉日志。维护人员告诉我,2 log4j配置配置文件log4j.propertieslog4j.rootLogger=INFO, stdout, I#ibatis logslog4j.logger.com.ibatis = INFOlog4j.logger.com.ibatis.common.jdbc.SimpleDataSource = INFOlog4j.logger.com.ibatis.common.jdbc.Scrip

2020-07-02 20:36:48 152 1

原创 线程池原理

线程池原理线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。它的主要特点为:线程复用、控制最大并发数、管理线程。1 线程复用每一个 Thread 的类都有一个 start 方法。 当调用 start() 启动线程时 Java 虚拟机会调用该类的 run()方法。 那么该类的 run() 方法中就是调用了 Runnable 对象的 run() 方法。我们可以继

2020-06-02 15:22:04 136

原创 线程上下文切换

线程上下文切换巧妙地利用了时间片轮转的方式, CPU 给每个任务都服务一定的时间,然后把当前任务的状态保存下来,在加载下一任务的状态后,继续服务下一任务,任务的状态保存及再加载, 这段过程就叫做上下文切换。时间片轮转的方式使多个任务在同一颗 CPU 上执行变成了可能。1 进程进程(也称作任务)是指一个程序运行的实例。在 Linux 系统中,线程就是能并行运行并且与他们的父进程(创建他们的进...

2020-05-06 10:47:13 299

原创 代码整洁之道 -- 1 整洁代码

开篇最近看到代码整洁之道(Clean Code)一书,阅读完第一章节后深有感触,故开始记录一下本书重点和阅读感受。1 整洁代码1.1 要有代码有人说代码会自动产生,不再需要人工编写。程序员完全没用了,因为商务人士可以从规约直接生成程序。但实际上,我们永远抛不掉代码,因为代码呈现了需求的细节。在某些层面上,这些细节无法被忽略或抽象,必须明确纸。将需求明确到机器可以执行的细节程度,就是编程要...

2020-04-30 10:10:16 125

原创 线程基本方法

线程基本方法1 线程等待(wait)调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知或被中断才会返回。需要注意的是调用 wait()方法后,会释放对象的锁。因此,wait 方法一般用在同步方法或同步代码块中。2 线程睡眠(sleep)sleep 导致当前线程休眠,与 wait 方法不同的是 sleep 不会释放当前占有的锁,sleep(long)会导致线程进入 TIME...

2020-04-26 16:33:31 93

原创 sleep 与 wait,start 与 run 的区别

sleep 与 wait,start 与 run 的区别1 sleep 与 wait 区别sleep() 方法是属于 Thread 类中的。而 wait() 方法是属于 Object 类中的。sleep() 方法导致程序暂停执行指定的时间,让出 cpu给其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态,这个过程中,线程不会释放对象锁。而当调用 wait() 方法,...

2020-04-23 19:35:05 517

原创 终止线程4种方式

终止线程4种方式1 正常运行结束程序运行结束,线程自动结束。2 使用退出标志退出线程一般 run()方法执行完,线程就会正常结束。然而,常常有些线程是伺服线程,它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。可以使用一个变量来控制循环,例如,最直接的方法就是设一个 boolean 类型的标志,并通过设置这个标志为 true 或 false 来控制 while 循环...

2020-04-23 19:19:10 204

原创 线程生命周期

线程生命周期当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5 种状态。尤其是当线程启动以后,它不可能一直"霸占"着 CPU 独自运行,所以 CPU 需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞之间切换。1 新建状态(...

2020-04-22 20:18:32 78

原创 4种线程池

4种线程池1 newCachedThreadPool创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。因此,长时间保持空闲的线程池不会使...

2020-04-22 20:01:38 77

原创 Java线程创建方式

JAVA 线程实现 / 创建方式1 继承 Thread 类Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过 Thread 类的 start()实例方法。start()方法是一个 native 方法,它将启动一个新线程,并执行 run()方法。public class MyThread extends Thread { publ...

2020-04-22 19:42:16 67

原创 JAVA 集合

JAVA 集合Java 集合主要包括两种类型的容器:集合(Collection)、映射(Map)。Collection 接口又有 3 种子类型:List、Set 和 Queue。1 ListList 是有序的 Collection。有三个实现类:ArrayList、Vector 和LinkedList。1.1 ArrayList排列有序,可重复底层使用数组查询快,增删慢线程...

2019-12-08 09:38:05 89

原创 JAVA NIO

JAVA NIONIO属于多路复用IO模型(详见五种IO模型)。在Java1.4之前的IO系统中,提供的都是面向流的IO,系统一次一个字节地处理数据,一个输入流产生一个字节的数据,一个输出流消费一个字节的数据,因此面向流的I/O速度非常慢。Java 1.4中推出了NIO,这是一个面向块(缓冲区)的IO系统,系统以块的方式处理,每一个操作在一步中产生或者消费一个数据库,大大提高了处理速度。NI...

2019-08-29 15:33:49 88

原创 五种IO模型

JAVA IO/NIO一 五种IO模型在网络环境下,可以通俗地将IO分为两步:等数据搬迁五种IO模型之间的区别就主要在于“等”的方式的不同。1 阻塞IO(blocking I/O)当用户线程发出IO请求之后,内核会去查看数据是否就绪,如果没有就绪就会等待数据就绪,而用户线程就会处于阻塞状态,用户线程交出CPU。当数据就绪之后,内核会将数据拷贝到用户线程,并返回结果给线程,用户线...

2019-08-26 17:59:59 207

原创 Effective Java -- 对于所有对象都通用的方法 -- 覆盖equals时请遵守通用约定

第三章 对于所有对象都通用的方法第十条 覆盖equals时请遵守通用约定不要轻易覆盖 equals 方法,除非迫不得已。如果覆盖 equals 方法,一定要比较所有关键域,并查看它们是否遵守合约的五个条款。

2019-08-22 16:45:00 114

原创 JAVA四种引用类型

JAVA四种引用类型强引用在 Java 中最常见的就是强引用。把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到 JVM 也不会回收。因此强引用是造成 Java 内存泄漏的主要原因之一。软引用弱引用虚引用...

2019-08-14 10:31:54 135

原创 SVN提交代码更新时提示证书验证失败

问题svn: E230001: Server SSL certificate verification failed: certificate issued for a different hostname, issuer is not trusted解决Win+R输入cmd打开终端,输入svn ls https://…(svn地址)输入p,回车按提示填写电脑密码、svn账号、svn密...

2019-08-07 15:33:24 1078 1

原创 垃圾回收与算法

垃圾回收与算法GC要做的三件事:哪些内存需要回收?(what)什么时候回收?(when)怎么回收?(how)1 如何确定垃圾由于引用计数法的循环引用问题,Java 使用的是可达性分析的方法。1.1 引用计数法(Reference-Counting)每个对象有一个引用计数器,当对象被引用一次则计数器加1,当对象引用失效一次则计数器减1,对于计数器为0的对象意味着是垃圾对象,可以被...

2019-08-05 11:45:48 122

原创 JVM运行时内存

JVM运行时内存Java 堆从 GC 的角度还可以细分为: 新生代( Eden 区 、 From Survivor 区 和 To Survivor 区 )和老年代。1 新生代用来存放新生的对象。一般占堆的 1/3 空间。新生代又分为 Eden 区、ServivorFrom、ServivorTo 三个区。1.1 Eden区Java新对象的出生地(如果新创建的对象占用内存很大,则直接分配...

2019-08-01 16:26:07 85

原创 JVM内存区域

JVM内存区域JVM内存区域主要分为:线程私有区域(程序计数器、虚拟机栈、本地方法区)、线程共享区域(JAVA堆、方法区)、直接内存。1 线程私有区域(Thread Local)线程私有数据区域生命周期与线程相同,依赖用户线程的启动/结束 而 创建/销毁。1.1 程序计数器(Program Counter Register)一块较小的内存空间,是当前线程所执行的字节码的行号指示器,每条...

2019-07-31 17:41:03 79

原创 Effective Java -- 创建和销毁对象 -- try-with-resources优先于try-finally

第二章 创建和销毁对象第九条 try-with-resources优先于try-finally在处理必须关闭的资源时,始终要优先考虑用try-with-resource,而不是用try-finally。这样得到的代码将更加简洁、清晰,产生的异常也更有价值。

2019-07-29 18:53:55 223

原创 Effective Java -- 创建和销毁对象 -- 消除过期的对象引用

第二章 创建和销毁对象第七条 消除过期的对象引用由于内存泄漏通常不会表现成明显的失败,所以它们可以在一个系统中存在很多年。往往只有通过仔细检查代码,或者借助于Heap剖析工具才能发现内存泄露问题。

2019-07-29 16:47:57 129

原创 Effective Java -- 创建和销毁对象 -- 避免创建不必要的对象

第二章 创建和销毁对象第六条 避免创建不必要的对象一般应该避免创建不必要的对象,可以通过优先使用静态工厂方法、将经常创建的对象缓存、优先使用基本类型而不是装箱基本类型等方式来避免。但是要注意并非任何时候都要避免创建对象。

2019-07-26 17:04:54 99

原创 Effective Java -- 创建和销毁对象 -- 优先考虑依赖注入来引用资源

第二章 创建和销毁对象第五条 优先考虑依赖注入来引用资源不要用静态工具类或Singleton来实现依赖。应该使用依赖注入,将这些资源或工厂传给构造方法,提高类的灵活性、可重用性和可测试性。

2019-07-26 10:12:25 263

原创 Effective Java -- 创建和销毁对象 -- 用私有构造器或者枚举类型强化Singleton属性(单例模式)

第二章 创建和销毁对象第三条 用私有构造器或者枚举类型强化Singleton属性单元素的枚举类型是实现Singleton的最佳方法

2019-07-24 16:02:05 117

原创 Effective Java -- 创建和销毁对象 -- 遇到多个构造器参数时考虑使用构造器(建造者模式)

第二章 创建和销毁对象第二条 遇到多个构造器参数时考虑使用构造器如果类的构造器或者静态工厂中具有多个参数,应该选择Builder模式。Builder模式的客户端代码与重叠构造器模式相比更易于阅读和编写;创建对象的过程也比JavaBeans更加安全。

2019-07-23 17:59:14 156

原创 Effective Java -- 创建和销毁对象 -- 用静态工厂方法代替构造器

第二章 创建和销毁对象第一条 用静态工厂方法代替构造器静态工厂经常更加合适,因此切忌第一反应就是提供公有的构造器,而不考虑静态工厂。

2019-07-22 16:13:39 102

原创 Mybatis Generator 数据库逆向工程(自动生成Dao、Bean、Mapping相关文件)

写在开头Mybatis Generator 有三种用法:命令行、eclipse 插件和 maven 插件。本文记录了 maven 插件的使用流程。1 导入 jar 包首先在 maven 的依赖库里找到 Mybatis Generator Core,本文选择的版本为1.3.5版本。在 maven 工程的 pom.xml 中添加该依赖<!-- https://mvnreposito...

2019-02-11 01:14:23 219

转载 JS中的let和var的区别

写在开头ES6 新增了 let 命令,用来声明局部变量。它的用法类似于 var,但是所声明的变量,只在 let 命令所在的代码块内有效,而且有暂时性死区的约束。先看个var的常见变量提升的面试题目:var a = 99; // 全局变量af(); // f是函数,虽然定义在调用的后面,但是函数声明会提升到作用域的顶部。 console.log(a); ...

2019-02-03 13:34:59 133

原创 浅谈Java的堆栈

写在开头首先简单介绍一下Java中的六大数据存储区:寄存器(register)因为位于处理器内部,所以是最快的存储区。由编译器根据需求进行分配,我们不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。栈(stack)位于通用RAM中,存放基本数据类型和引用变量。堆(heap)也存在于RAM中,存放所有new出来的Java对象。静态区(static storage...

2019-01-27 16:47:24 146

原创 try...catch语句中return和finally到底谁先执行

写在开头这个问题真的困扰了我很久,感觉简直像一个哲学(?)问题。私下和朋友们对这个问题讨论了很久,又在网上查找了很多相关资料,终于还是把这个问题理清楚了。(自认为 )我的结论是:在try…catch语句中,当return执行到快要结束时,转而执行finally,最后再继续执行return。…这个答案看起来是不是还是很哲学?下面我来给出详细解释。return和finally的定义首先来看...

2019-01-14 12:58:56 2462 1

原创 Java的参数传递到底是值传递还是引用传递

Java的参数传递到底是值传递还是引用传递写在开头1、修改基本类型参数2、修改引用类型参数3、交换两个引用类型参数的引用结论写在开头简单粗暴点,开头直接呈上答案:在Java 中参数的传递总是采用“值传递”的方式。解释一下什么是“值传递”和“引用传递”:值传递(call by value):表示方法接收的是调用者提供的值。引用传递(call by reference):表示方法接收的是调...

2019-01-11 16:03:49 363

空空如也

空空如也

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

TA关注的人

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