JUC锁类和原子类
锁类在JDK 5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,Lock接口提供了与synchronized关键字类似的同步功能,但需要在使用时手动获取锁和释放锁。
Lock和Condition接口使用并发包中的锁和synchronized锁不太一样,这里的锁可以认为是一把真正意义上的锁,每个锁都是一个对应的锁对象,只需要向锁对象获取锁或是释放锁即可。Lock接口定义:
public interface Lock { //获取锁,拿不到锁会阻塞,等待其他线程释放锁,获取到锁后返回 void lock(); //同上,但是等待过程中会响应中断 void lockInterruptibly() throws InterruptedException; //尝试获取锁,但是不会阻塞,如果能获取到会返回true,不能返回false boolean tryLock(); //尝试获取锁,但是可以限定超时时间,如果超出时间还没拿到锁返回false,否则返回true,可以响应中断 boolean tryLock(long time, ...
JVM类与类加载
java的类字节码文件如何加载到内存中的?
类加载过程类加载的触发条件JVM并不会一次性加载所有类,而是采用“按需加载”策略,即在需要的时候才会进行类的加载。
触发类加载的操作一般在这些情况下,如果类没有被加载,那么会被自动加载:
使用 new 关键字创建对象时
MyClass obj = new MyClass();
访问类的静态变量(包括读取或写入,不是 final 修饰的常量)时
int value = MyClass.staticField;
调用类的静态方法时
MyClass.staticMethod();
使用反射机制(如 Class.forName()、Class.getMethod() 等)时
Class<?> clazz = Class.forName("com.example.MyClass");
子类初始化时,如果父类尚未初始化,会先触发父类的加载
class A { static int a = 10; }class B extends A { static int b = ...
JVM垃圾回收机制
Java会自动管理和释放内存,它不像C/C++那样要求我们手动管理内存,JVM提供了一套全自动的内存管理机制,当一个Java对象不再用到时,JVM会自动将其进行回收并释放内存,那么对象所占内存在什么时候被回收,如何判定对象可以被回收,以及如何去进行回收工作也是JVM需要关注的问题。
对象存活判定算法对象在什么情况下可以被判定为不再使用已经可以回收了?
引用计数法如果要经常操作一个对象,那么首先一定会创建一个引用变量:
//str就是一个引用类型的变量,它持有对后面字符串对象的引用,可以代表后面这个字符串对象本身String str = "abc";
只要一个对象还有使用价值,就可以通过它的引用变量来进行操作,那么可否这样判断一个对象是否还需要被使用:
每个对象都包含一个引用计数器,用于存放引用计数(存放被引用的次数)
每当有一个地方引用此对象时,引用计数+1
当引用失效(比如离开了局部变量的作用域或是引用被设定为null)时,引用计数-1
当引用计数为0时,表示此对象不可能再被使用,因为这时我们已经没有任何方法可以得到此对象的引用了
但是这样存在一个 ...
JVM概述与内存管理
JVM启动流程虚拟机的启动入口位于jdk/src/share/bin/java.c的JLI_Launch函数,整个流程分为如下几个步骤:
配置JVM装载环境
解析虚拟机参数
设置线程栈大小
执行JavaMain方法
JLI_Launch函数的定义,在入口点的参数有很多个,其中包括当前的完整版本名称、简短版本名称、运行参数、程序名称、启动器名称等:
intJLI_Launch(int argc, char ** argv, /* main argc, argc */ int jargc, const char** jargv, /* java args */ int appclassc, const char** appclassv, /* app classpath */ const char* fullversion, /* full version defined */ const char* dotversion, ...
设计模式——行为型模式
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。
行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。
行为型模式分为:
模板方法模式
策略模式
命令模式
职责链模式
状态模式
观察者模式
中介者模式
迭代器模式
访问者模式
备忘录模式
解释器模式
以上11种行为型模式,除了模板方法模式和解释器模式是类行为型模式,其他的全部属于对象行为型模式
解释器模式解释器顾名思义,就是对语言进行解释,根据不同的语义来做不同的事情。笼统点来讲就是给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。
在解释器模式中,我们需要将待解决的问题,提取出规则,抽象为一种“语言”。比如加减法运算,规则为:由数值和+-符号组成的合法序列,“1+3-2” 就是这种语言的句子。
比如计算器就是根据输入的算式,去进 ...
设计模式——结构型模式
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。
由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。
结构型模式分为以下7种:
代理模式
适配器模式
装饰者模式
桥接模式
外观模式
组合模式
享元模式
代理模式由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译期就生成,而动态代理代理类则是在Java运行时动态生成。动态代理又有JDK代理和CGLib代理两种。
静态代理火车站买票案例,如果要买火车票的话,需要去火车站买票,坐车到火车站,排队等一系列的操作,显然比较麻烦。而火车站在多个地方都有代售点,我们去代售点买票就方便很多了。火车站是目标对象,代售点是代理对象。
//卖票接口public interface SellTickets ...
设计模式——创建型模式
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。
这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。
创建型模式分为:
单例模式
工厂方法模式
抽象工程模式
原型模式
建造者模式
单例模式这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
即在整个程序中,同一个类始终只会有一个对象来进行操作。比如数据库连接类,实际上只需要创建一个对象或是直接使用静态方法就可以了,没必要去创建多个对象。
单例设计模式分类两种:
饿汉式:类加载就会导致该单实例对象被创建
懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时才会创建
饿汉式
/** * 饿汉式 * 静态变量创建类的对象 */public class Singleton { //私有构造方法 private Singleton() {} //在成员位置创建该类的对象 private static Singleton in ...
设计模式——设计原则
设计模式分类
创建型模式
用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。含有单例、原型、工厂方法、抽象工厂、建造者5种创建型模式
结构型模式
用于描述如何将类或对象按某种布局组成更大的结构,即类或对象的组合,含有代理、适配器、桥接、装饰、外观、享元、组合7种结构型模式
行为型模式
用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责,即类或对象之间的交互和通信。含有模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器11种行为型模式
类别
模式
核心思想
典型应用场景
创建型
单例模式
确保一个类只有一个实例
全局唯一对象(如配置管理器)
工厂方法模式
由子类决定实例化哪个类
框架中对象的创建
抽象工厂模式
创建相关对象的家族
跨平台的 UI 组件库
建造者模式
分离复杂对象的构建与表示
复杂对象的创建(如 HTML 文档生成器)
原型模式
通过复制现有对象创建新对象
对象的创建成本较高时
结构型
适配器模式
将一个接口转换成客户端期望的另一个接口
兼容旧 ...
redis内存回收
Redis内存回收机制Redis中的内存策略主要包含下列四点:
内存清除策略(Eviction Policy):当Redis内存空间不足时,会根据特定的算法删除一些key来释放内存。其中,常用的算法有LRU(最少最近使用)、LFU(最少使用频率)和随机算法
内存淘汰策略(Expiration):在插入或更新key的时候,可以指定key的过期时间(expire)时间。过期后,Redis会自动将key删除,释放内存
内存回收策略(Memory Reclamation):在使用Redis时,可能会因为未正确释放内存而导致内存泄漏。Redis针对这种情况实现了自动内存回收机制来防止内存泄漏的问题
内存优化策略(Memory Optimization):Redis提供了各种内存优化策略,例如使用压缩(压缩整数值、压缩非常短的字符串)、使用哈希对象来优化内存使用等,以最大限度地减少内存使用。Redis也使用专门的数据结构来实现某些特定的数据类型,例如基数计数器和位数组,这些也是为了优化内存使用而设计的
过期key处理Redis之所以性能强,最主要的原因就是基于内存存储。然而单节点的Redis其 ...
redis网络模型
Linux网络模型在《UNIX网络编程》一书中,总结归纳了5种IO模型:
阻塞IO(Blocking IO)
非阻塞IO(Nonblocking IO)
IO多路复用(IO Multiplexing)
信号驱动IO(Signal Driven IO)
异步IO(Asynchronous IO)
阻塞IO应用程序想要去读取数据,他是无法直接去读取磁盘数据的,他需要先到内核里边去等待内核操作硬件拿到数据,这个过程就是1,是需要等待的,等到内核从磁盘上把数据加载出来之后,再把这个数据写给用户的缓存区,这个过程是2,如果是阻塞IO,那么整个过程中,用户从发起读请求开始,一直到读取到数据,都是一个阻塞状态。
用户去读取数据时,会去先发起recvform一个命令,去尝试从内核上加载数据,如果内核没有数据,那么用户就会等待,此时内核会去从硬件上读取数据,内核读取数据之后,会把数据拷贝到用户态,并且返回ok,整个过程,都是阻塞等待的,这就是阻塞IO
非阻塞IO非阻塞IO的recvfrom操作会立即返回结果而不是阻塞用户进程
阶段一:
用户进程尝试读取数据(比如网卡数据)
此时数据尚未到达,内核 ...