设计原则
-
开-闭原则
-
SOLID原则
- 里氏替换原则,面向接口/抽象类编程
在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象
- happens-before原则
具体的定义为: 1)如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。
2)两个操作之间存在happens-before关系,并不意味着Java平台的具体实现必须要按照happens-before关系指定的顺序来执行。如果重排序之后的执行结果,与按happens-before关系来执行的结果一致,那么这种重排序并不非法(也就是说,JMM允许这种重排序)。
具体的规则: (1)程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。 (2)监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。 (3)volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。 (4)传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。 (5)start()规则:如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。 (6)Join()规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。 (7)程序中断规则:对线程interrupted()方法的调用先行于被中断线程的代码检测到中断时间的发生。 (8)对象finalize规则:一个对象的初始化完成(构造函数执行结束)先行于发生它的finalize()方法的开始。 ———————————————— 版权声明:本文为CSDN博主「发奋小青年」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/ma_chen_qq/article/details/82990603
常见设计模式
单例
- 饿汉
在类加载阶段就实例化类
public class Singleton {
// 使用private将构造方法私有化,以防外界通过该构造方法创建多个实例
private Singleton() {
}
// 如果使用private封装该实例,则需要添加get方法实现对外界的开放
private static Singleton instance = new Singleton();
// 添加static,将该方法变成类所有 通过类名访问
public static Singleton getInstance(){
return instance;
}
}
- 懒汉
在类被第一次访问的时候再实例化
class LazySingleton {
//**volatile是解决指令重排序的问题,防止对象未成功初始化就被使用**
//因为对象的创建实际上是三条指令: 1、分配内存地址 2、内存地址初始化 3、返回内存地址句柄 其中2、3之间可能发生指令冲排序,导致线程A正在创建对象先执行1、3两步,结果线程B进来判断句柄已经不为空,直接返回给上层方法,此时对象还没有正确初始化内存,导致上层方法发生严重错误。
private volatile static LazySingleton instance = null;
private LazySingleton() { }
public static LazySingleton getInstance() {
//第一重判断
if (instance == null) {
//锁定代码块
synchronized (LazySingleton.class) {
//第二重判断
if (instance == null) {
instance = new LazySingleton(); //创建单例实例
}
}
}
return instance;
}
}
- 内部静态类
class Singleton {
private Singleton() {
}
//Singleton类加载时HolderClass内部类不会加载,所以Singleton不会实例化,等调用getInstance的时候才实例化
private static class HolderClass {
private final static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return HolderClass.instance;
}
public static void main(String args[]) {
Singleton s1, s2;
s1 = Singleton.getInstance();
s2 = Singleton.getInstance();
System.out.println(s1==s2);
}
}
- 枚举单例
public enum Singleton {
INSTANCE;
public void doSomething() {
System.out.println("doSomething");
}
}
工厂三兄弟
- 简单工厂/静态工厂
- 工厂方法
- 抽象工厂
观察者模式
Java内置的Observerable、Observer