JUST DO IT


  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

  • 搜索

Java垃圾回收

发表于 2020-06-24 | 分类于 Java深入

内存回收常用算法:

  1. 引用计数
  2. 可达性分析(GC Root)

如何判断一个对象的死亡?

1
当一个对象不再被任何存活的对象继续引用的时候,这个对象就死亡了。
阅读全文 »

Java NIO实例

发表于 2020-02-01 | 分类于 Java基础

示例来源(imooc)(代码下载)

阅读全文 »

观察者模式

发表于 2020-01-23 | 分类于 设计模式

定义

观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

关键字

  • Observable
    • 即被观察者,也可以被叫做主题(Subject)。通常有注册方法(register),取消注册方法(remove)和通知方法(notify)。
  • Observer
    • 即观察者,可以接收到主题的更新。当对某个主题感兴趣的时候需要注册自己,在不需要接收更新时进行注销操作。

例子与应用

  1. 用户从报社订阅报纸,报社和用户之间是一对多依赖,用户可以在报社订阅(register)报纸,报社可以把最新的报纸发给用户(notify),用户自动收到更新。在用户不需要的时候还可以取消注册(remove)。
  2. Android中的EventBus,Rxjava的实现都是基于观察者模式的思想。再比如回调函数:Android中对Button的点击监听等等。
  3. 观察者模式可以用来解耦
阅读全文 »

8种方法实现线程顺序执行

发表于 2019-11-17 | 分类于 Java并发

本文使用8种方法实现在多线程中让线程按顺序运行:

  1. 使用线程的join方法
  2. 使用主线程的join方法
  3. 使用线程的wait/notify方法
  4. 使用单线程化线程池
  5. 使用线程的Condition(条件变量)
  6. 使用线程的CountDownLatch(倒计数)
  7. 使用线程的CyclicBarrier(回环栅栏)
  8. 使用线程的Semaphore(信号量)
阅读全文 »

MyBatis实现原理:动态代理的运用

发表于 2019-11-14 | 分类于 MyBatis

动态代理的功能:

  • 通过拦截器方法回调,对目标target方法进行增强。
  • 动态代理还有”投鞭断流“的霸权,连目标target都不要的使用方式。

自动映射器Mapper自己实现

定义pojo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.justxzm.proxy;

public class User {
private Integer id;
private String name;
private int age;

public User(Integer id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
// getter setter
}
阅读全文 »

自定义类加载器实现热加载

发表于 2019-11-05 | 分类于 Java深入

什么是热加载

  • 热加载是指在不重启服务的情况下让更改的代码生效。
  • 热加载基于 Java 的类加载器实现,可以显著提升开发以及调试的效率。
  • 由于热加载的不安全性,一般不会用于正式的生产环境。

热加载与热部署的区别

相同点:

  • 都可以在不重启服务的情况下编译/部署项目。
  • 都是基于 Java 的类加载器实现的。

不同点:

  • 部署方式上:
    • 热部署是在服务器运行时重新部署项目。
    • 热加载是在运行时重新加载 class。
  • 实现原理上:
    • 热部署是直接重新加载整个应用,耗时相对较高。
    • 热加载是在运行时重新加载 class,后台启动一个线程不断检测类是否改变。
  • 使用场景上:
    • 热部署更多的是在生产环境使用。
    • 热加载更多在开发环境上使用。线上由于安全性问题不会使用,难以监控。
阅读全文 »

Java并发总结-Executor框架

发表于 2019-10-20 | 分类于 Java并发

Java线程的创建与销毁需要一定的开销,如果为每一个任务创建一个新线程来执行:

  • 这些线程的创建与销毁将消耗大量的计算资源。
  • 可能会使处于高负荷状态的应用最终崩溃。

Java的线程既是工作单元,也是执行机制。从JDK 5开始,把工作单元与执行机制分离开来。工作单元包括Runnable和Callable,而执行机制由Executor框架提供。

Executor框架简介

Executor框架的两级调度模型

在HotSpot VM的线程模型中,Java线程(java.lang.Thread)被一对一映射为本地操作系统线程:

  1. Java线程启动时会创建一个本地操作系统线程。
  2. 当该Java线程终止时,这个操作系统线程也会被回收。
  3. 操作系统会调度所有线程并将它们分配给可用的CPU。

这种两级调度模型:

  • 在上层,Java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定数量的线程,应用程序通过Executor框架控制上层的调度;
  • 在底层,操作系统内核将这些线程映射到硬件处理器上,下层的调度由操作系统内核控制,下层的调度不受应用程序的控制。
阅读全文 »

Java并发总结-线程池

发表于 2019-10-19 | 分类于 Java并发

使用线程池的好处

Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处:

  1. 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  2. 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
  3. 提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用线程池,必须对其实现原理了如指掌。

线程池的实现原理

阅读全文 »
1…456…13
Try.Catch

Try.Catch

孤单而灿烂

102 日志
16 分类
26 标签
© 2017 — 2023 Try.Catch
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4
本站访客数 人次 本站总访问量 次
0%