当前位置: 首页 > news >正文

松原做公司网站网站的排名与权重

松原做公司网站,网站的排名与权重,国外js网站,多个网站如何做301赐萧瑀 实现方案饿汉模式懒汉式#xff08;非线程安全#xff09;懒汉模式#xff08;线程安全#xff09;双重检查锁定静态内部类 攻击方式序列化攻击反射攻击 枚举(最佳实践)枚举是一种类 唐 李世民 疾风知劲草#xff0c;板荡识诚臣。 勇夫安识义#xff0c;智者必怀仁… 赐萧瑀 实现方案饿汉模式懒汉式非线程安全懒汉模式线程安全双重检查锁定静态内部类 攻击方式序列化攻击反射攻击 枚举(最佳实践)枚举是一种类 唐 李世民 疾风知劲草板荡识诚臣。 勇夫安识义智者必怀仁。 实现单例模式的主要方式有饿汉模式、懒汉模式非线程安全、懒汉模式线程安全、双重检查锁定、静态内部类和枚举方式。攻击方式有克隆攻击、序列化攻击和反射攻击。 实现方案 序号实现方式描述优点缺点1饿汉式在类加载时就创建实例实现简单线程安全如果实例未被使用会造成资源浪费2懒汉式非线程安全在第一次调用时创建实例延迟加载节省资源非线程安全多线程环境下可能创建多个实例3懒汉式线程安全在第一次调用时创建实例并使用同步方法确保线程安全延迟加载线程安全每次调用 getInstance 都需要同步性能较差4双重检查锁定在第一次调用时创建实例并使用双重检查锁定机制确保线程安全延迟加载线程安全且只在第一次创建实例时同步性能较好实现较复杂需要注意 volatile 关键字的使用5静态内部类利用静态内部类的特性在第一次调用时创建实例延迟加载线程安全实现简单无法传递参数给单例实例6枚举使用枚举类型实现单例实现简单线程安全且能防止反射和序列化破坏单例不能延迟加载且不够灵活 饿汉模式 package com.cld.designpattern.creation.singleton.hungry;import java.io.Serializable;/*** 饿汉式* 是否 Lazy 初始化否* p* 是否多线程安全是* p* 实现难度易* p* 描述这种方式比较常用但容易产生垃圾对象。* 优点没有加锁执行效率会提高。* 缺点类加载时就初始化浪费内存。* 它基于 classloader 机制避免了多线程的同步问题不过instance 在类装载时就实例化虽然导致类装载的原因有很多种在单例模式中大多数都是调用 getInstance 方法 但是也不能确定有其他的方式或者其他的静态方法导致类装载这时候初始化 instance 显然没有达到 lazy loading 的效果。** author 休克柏*/ public class HungrySingleton implements Serializable,Cloneable {private static final HungrySingleton INSTANCE new HungrySingleton();private HungrySingleton() {if (INSTANCE ! null) {throw new RuntimeException(单例构造器禁止反射调用);}}public static HungrySingleton getInstance() {return INSTANCE;}Overridepublic HungrySingleton clone() {//避免克隆攻击return getInstance();} }懒汉式非线程安全 import java.io.ObjectStreamException; import java.io.Serializable;/*** 线程不安全懒汉式* 是否 Lazy 初始化是* * 是否多线程安全否* * 实现难度易* * 描述这种方式是最基本的实现方式这种实现最大的问题就是不支持多线程。因为没有加* 锁synchronized所以严格意义上它并不算单例模式。* 这种方式 lazy loading 很明显不要求线程安全在多线程不能正常工作。** author 休克柏*/ public class Lazy1Singleton implements Serializable {private static Lazy1Singleton instance;private Lazy1Singleton() {}/*** 线程不安全** return Lazy1Singleton*/public static Lazy1Singleton getInstance() {if (instance null) {instance new Lazy1Singleton();}return instance;}/*** 反序列化的时候会调用该方法从而避免反序列化对单例的破坏* return Lazy1Singleton* throws ObjectStreamException*/private Object readResolve() throws ObjectStreamException {return getInstance();} }懒汉模式线程安全 package org.cqcs.knowledge.designpattern.creation.singleton.lazy;import java.io.Serializable;/*** 线程安全懒汉式* 是否 Lazy 初始化是* p* 是否多线程安全是* p* 实现难度易* p* 描述这种方式具备很好的 lazy loading能够在多线程中很好的工作但是效率很低99% 情况下不需要同步。* 优点第一次调用才初始化避免内存浪费。* 缺点必须加锁 synchronized 才能保证单例但加锁会影响效率。* getInstance() 的性能对应用程序不是很关键该方法使用不太频繁。** author 休克柏*/ public class Lazy2Singleton implements Serializable {private static Lazy2Singleton instance;private Lazy2Singleton() {}/*** 线程安全但是synchronized锁比较重** return Lazy2Singleton*/public static synchronized Lazy2Singleton getInstance() {if (instance null) {instance new Lazy2Singleton();}return instance;} } 双重检查锁定 /*** JDK 版本JDK1.5 起* * 是否 Lazy 初始化是* * 是否多线程安全是* * 实现难度较复杂* * 描述这种方式采用双锁机制安全且在多线程情况下能保持高性能。* getInstance() 的性能对应用程序很关键。* * Lazy2Singleton相对于Lazy1Singleton的效率问题其实是为了解决1%几率的问题* 而使用了一个100%出现的防护盾。* 那有一个优化的思路就是把100%出现的防护盾也改为1%的几率出现使之只出现在可能会导致多个实例出现的地方。** author 休克柏*/ public class DclSingleton implements Serializable {/*** volatile 的作用是对dclSingleton的写操作有一个内存屏障这样在它的赋值完成之前就不用会调用读操作。* * volatile关键字通过提供“内存屏障”的方式来防止指令被重排序为了实现volatile的内存语义* 编译器在生成字节码时会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。* * 在java内存模型中volatile 关键字作用可以是保证可见性或者禁止指令重排。* 这里是因为 dclSingleton new DclSingleton() 它并非是一个原子操作事实上* 在 JVM 中上述语句至少做了以下这 3 件事* * 第一步是给 dclSingleton 分配内存空间* * 第二步开始调用 DclSingleton 的构造函数等来初始化 dclSingleton* * 第三步将 dclSingleton 对象指向分配的内存空间执行完这步 dclSingleton 就不是 null 了。* * 这里需要留意一下 1-2-3 的顺序因为存在指令重排序的优化也就是说第 2 步和第 3 步的顺序是* 不能保证的最终的执行顺序可能是 1-2-3也有可能是 1-3-2。* 如果是 1-3-2那么在第 3 步执行完以后dclSingleton 就不是 null 了可是这时第 2 步并没* 有执行singleton 对象未完成初始化它的属性的值可能不是我们所预期的值。* 假设此时线程 2 进入 getInstance 方法由于 dclSingleton 已经不是 null 了* * 所以会通过第一重检查并直接返回但其实这时的 singleton 并没有完成初始化所以使用这个实例的时候会报错。*/private volatile static DclSingleton dclSingleton;private DclSingleton() {}public static DclSingleton getDlcSingleton() {if (dclSingleton null) {synchronized (DclSingleton.class) {if (dclSingleton null) {//1. 给 dclSingleton 分配内存//2. 调用 dclSingleton 的构造函数来初始化成员变量形成实例//3. 将dclSingleton对象指向分配的内存空间执行完这步 singleton才是非 null了//上述3步是dclSingleton new DclSingleton()的指令执行顺序dclSingleton new DclSingleton();}}}return dclSingleton;}/*** 反序列化的时候会调用该方法从而避免反序列化对单例的破坏* return Lazy1Singleton* throws ObjectStreamException*/private Object readResolve() throws ObjectStreamException {return getDlcSingleton();} }静态内部类 package org.cqcs.knowledge.designpattern.creation.singleton.staticinnerclass;/***静态内部类的实现方式利用了 类加载机制 和 静态内部类的特性 来保证单例的线程安全和延迟加载。** 延迟加载* 静态内部类不会在外部类加载时立即加载而是在第一次调用 getInstance() 方法时才会加载内部类并创建实例。这种方式实现了延迟加载避免了资源浪费。** 线程安全* JVM 在加载类时是线程安全的静态内部类在加载时会由 JVM 保证线程安全因此不需要额外的同步机制。** 静态内部类的特性* 静态内部类是独立于外部类的只有在被引用时才会加载。* 静态内部类的静态成员变量单例实例在类加载时初始化且只会初始化一次。* author 休克柏*/ public class StaticInnerClass {private StaticInnerClass() {}private static class SingletonHolder {private static final StaticInnerClass INSTANCE new StaticInnerClass();}public static StaticInnerClass getInstance() {return SingletonHolder.INSTANCE;} }攻击方式 序列化攻击 反射攻击 枚举(最佳实践) There are three kinds of reference types: class types, array types, and interface types. Their values are references to dynamically created class instances, arrays, or class instances or arrays that implement interfaces, respectively.一共有三种引用类型class types, array types, and interface types. 其值指向动态创建的类实例数组或者分别实现了接口的类实例或者数组。 从中我们可以得知enum不是一种专门的引用数据类型它是类。 枚举是一种类 Day.java public enum Day {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } 编译Day.java生成Day.class javac Day.java反编译Day.class javap -c Day.classCompiled from Day.java public final class demo.Day extends java.lang.Enumdemo.Day {public static final demo.Day MONDAY;public static final demo.Day TUESDAY;public static final demo.Day WEDNESDAY;public static final demo.Day THURSDAY;public static final demo.Day FRIDAY;public static final demo.Day SATURDAY;public static final demo.Day SUNDAY;public static demo.Day[] values();Code:0: getstatic #1 // Field $VALUES:[Ldemo/Day;3: invokevirtual #2 // Method [Ldemo/Day;.clone:()Ljava/lang/Object;6: checkcast #3 // class [Ldemo/Day;9: areturn………………从输出我们可以发现定义语句public final class demo.Day extends java.lang.Enumdemo.Day知道我们的Day.java就是一个类该类继承了java.lang.Enum. /*** This is the common base class of all Java language enumeration types.** More information about enums, including descriptions of the* implicitly declared methods synthesized by the compiler, can be* found in section 8.9 of* citeThe Javatrade; Language Specification/cite.** p Note that when using an enumeration type as the type of a set* or as the type of the keys in a map, specialized and efficient* {linkplain java.util.EnumSet set} and {linkplain* java.util.EnumMap map} implementations are available.** param E The enum type subclass* author Josh Bloch* author Neal Gafter* see Class#getEnumConstants()* see java.util.EnumSet* see java.util.EnumMap* since 1.5*/ SuppressWarnings(serial) // No serialVersionUID needed due to// special-casing of enum types. public abstract class EnumE extends EnumEimplements ComparableE, Serializable {
http://www.ho-use.cn/article/10817611.html

相关文章:

  • 建设网站的 域名申请的分析网站流量少
  • 渭南定制网站建设公司在线商城网站模板
  • 门户网站开发报价h5开发和前端开发区别
  • 一个域名可以做几个网站吗国家企业信息公示网查询全国
  • 新县住房和城乡规划建设局网站在线制作结婚证
  • 手机资讯网站源码做外贸如何通过网站精准找到老板联系方法
  • 去马来西亚做网站网站江苏连云港网站建设公司
  • 网站开发用c 语言网站推广策划评估指标有哪些
  • 流线型的网站建设哈尔滨企业自助建站
  • 怎么做营销网站推广卡盟网站建设
  • 网站建设维护员google推广 的效果
  • 无锡市新吴区建设环保局网站学编程有什么好处
  • 湛江制作企业网站html做网页
  • 网站大全网站的建设可以起到什么作用是什么意思
  • 做个外贸网站一般需要多少钱wordpress建网店
  • 调用wordpress媒体库上传seo怎样新建网站
  • 延寿县建设银行网站我想做个网站要多少钱
  • 厦门市翔安建设局网站个人网站做哪一种比较赚钱
  • 如何用自己电脑做网站服务器怎样在凡科网站做网页
  • 深圳网站建设便捷个人网站怎么做口碑
  • 网站制作视频教程大全贵州省住房和城乡建设厅网站搜索
  • 北京网站开发联系电话seo网站推广的主要目的
  • 网站建设推广渠道小程序开发需求方案
  • dw做的网站成品质感设计网站
  • 宁波网站建设h5wordpress video主题
  • 网站的设计技术策划水果网站建设策划书
  • 郑州营销网站托管公司国外网站上不去 dns
  • 在那个网站做直播好赚钱国内免费域名注册
  • 机械设备如何做网站云建站的正确步骤
  • 网站关键词收费沧州讯呗网络科技有限公司