用一个织梦程序做两个网站,wordpress query.php,2023年适合小学生的新闻,我认为的网络营销是什么1.1 单例 创建一个单例对象 SingleModel , SingleModel 类有它的私有构造函数和本身的一个静态实例。 SingleModel 类提供了一个静态方法#xff0c;供外界获取它的静态实例。 DesignTest 我们的演示类使用 SingleModel 类来获取 SingleModel 对象。 创建 Single…1.1 单例 创建一个单例对象 SingleModel , SingleModel 类有它的私有构造函数和本身的一个静态实例。 SingleModel 类提供了一个静态方法供外界获取它的静态实例。 DesignTest 我们的演示类使用 SingleModel 类来获取 SingleModel 对象。 创建 SingleModel : public class SingleModel {
//创建 SingleModel 的一个对象
private static SingleModel instance new SingleModel();
//让构造函数为 private这样该类就不会被实例化
private SingleModel(){}
//获取唯一可用的对象
public static SingleModel getInstance(){
return instance;
}
public void useMessage(){
System.out.println(Single Model!);
}
} 测试 public class DemoTest {
/****
* 单例模式测试
*/
Test
public void testSingleModel(){
//不合法的构造函数
//编译时错误构造函数 SingleModel() 是不可见的
//SingleModel singleModel new SingleModel();
//获取唯一可用的对象
SingleModel singleModel1 SingleModel.getInstance();
SingleModel singleModel2 SingleModel.getInstance();
//显示消息
singleModel1.useMessage();
//创建的2个对象是同一个对象
System.out.println(singleModel1 singleModel2);
}
} 输入结果如下 Single Model! true 我们测试创建 10 万个对象用单例模式创建仅占内存 104 字节而如果用传统方式创建 10 万个对 象占内存大小为 2826904 字节。 1.2 扩展 单例模式有多种创建方式刚才创建方式没有特别的问题但是程序启动就需要创建对象不管你用不 用到对象都会创建对象都会消耗一定内存。因此在单例的创建上出现了多种方式。 懒汉式 1 、延迟加载创建也就是用到对象的时候才会创建 2 、线程安全问题需要手动处理 ( 不添加同步方法线程不安全添加了同步方法效率低 ) 3 、实现容易 案例如下 SingleModel1 public class SingleModel1 {private static SingleModel1 instance;private SingleModel1(){}public static SingleModel1 getInstance(){if(instance null){instance new SingleModel1();}return instance;}} 如果在创建对象实例的方法上添加同步 synchronized , 但是每次 get 获取对象都必须排队竞争效率极 低代码如下 添加同步会解决多线程安全的问题但是会明显的降低获取对象实例的效率。 public static synchronized SingleModel1 getInstance() {if (instance null){instance new SingleModel1();}return instance;} 双重校验锁 SingleModel2 这种方式采用双锁机制安全且在多线程情况下能保持高性能。 public class SingleModel2 {//不实例化private static SingleModel2 instance;//让构造函数为 private这样该类就不会被实例化private SingleModel2(){}//获取唯一可用的对象public static SingleModel2 getInstance(){
//instance为空的时候才创建对象if(instancenull){
//同步锁效率比懒汉式高synchronized (SingleModel2.class){
//这里需要判断第2次为空if(instancenull){instance new SingleModel2();}}}return instance;}public void useMessage(){System.out.println(Single Model!);}} 指令重排问题 对象创建一般正确流程如下 申请内存空间 创建并初始化对象 将变量指向申请的内存空间地址 但其实在对象创建的时候也有可能发生 指令重排问题也就是上面流程会被打乱 申请内存空间 将变量指向申请的内存空间地址 //这一步后变量不再为null但是初始化其实并没完成 创建并初始化对象 如果是这样的话双检锁在多线程情况下也会出现问题需要添加 volatile 属性该属性能防止指令 重排代码如下 public class SingleModel2 {//不实例化private static volatile SingleModel2 instance;//让构造函数为 private这样该类就不会被实例化private SingleModel2(){}//获取唯一可用的对象public static SingleModel2 getInstance(){
//instance为空的时候才创建对象if(instancenull){
//同步锁效率比懒汉式高synchronized (SingleModel2.class){
//这里需要判断第2次为空if(instancenull){instance new SingleModel2();}}}return instance;}public void useMessage(){System.out.println(Single Model!);}} 1.3 单例模式特点 单例类只能有一个实例。 A a new A() 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 1.4单例模式优点 在内存里只有一个实例减少了内存的开销尤其是频繁的创建和销毁实例。 避免对资源的多重占用比如写文件操作。