32 | 答疑课堂:模块五思考题集锦
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了设计模式在系统性能优化中的重要作用,特别是在高并发场景中,线程协作相关的设计模式能够显著提高程序的运行性能。文章详细介绍了单例模式的实现方式,包括枚举实现的饿汉单例模式和基于内部类实现的懒汉单例模式。此外,文章还介绍了单例模式和享元模式的区别,以及使用Future设计模式来获取异步线程的执行结果。另外,文章还提到了限流的实现方式,包括漏桶算法和令牌桶算法。文章内容涵盖了多线程的设计模式,以及在实际应用中的优化方式,对于系统性能优化有很好的参考价值。责任链模式、策略模式与装饰器模式的应用场景也得到了介绍,为读者提供了更多设计模式在实际开发中的应用思路。文章内容丰富,涵盖了系统性能优化和设计模式的相关知识,适合对系统性能优化和设计模式感兴趣的读者阅读学习。
《Java 性能调优实战》,新⼈⾸单¥59
全部留言(13)
- 最新
- 精选
- 发条橙子 。老师, 对于单例模式那块还是有些不解,希望老师解答 :😄 在类初始化时 会将 static成员变量放到 <clinit> 方法中 ,在类加载准备阶段负责为其创建内存,到了初始化阶段执行<clinit >方法 进行赋值。 1. 请问在类加载的时候也会存在多线程的场景么?这块不太好理解 。以及后面改成了创建一个内部类, 在类加载的时候内部类应该会一起被加载 ,这时候内部类中的static也会一起被赋值,和直接在外层的类中直接初始化有什么区别么 ? 2. 老师,另外有个点想确认下, 类的字面量(字符串和final修饰的成员变量)会在类加载的时候被放到堆的永久代中(运行时常量池)。那 static修饰的成员变量还是放在元数据空间里是么
作者回复: 1、外部类初次加载,会初始化静态变量、静态代码块、静态方法,但不会加载内部类和静态内部类。 如果我们使用内部类实现,不会在初始化类时加载内部类,只有在我们第一次调用EnumSingleton.INSTANCE,才会加载 EnumSingleton 类,而只有在加载EnumSingleton类之后,才会实例化创建INSTANCE对象,由于INSTANCE是一个静态成员变量,所以在初始化时由<clinit> 方法保证线程安全。 2、元空间存放的是类元素,而静态常量池存放的是类的字面量和字符引用,运行时常量池存放的是直接引用。这里的静态常量池也是很多人说的字符串常量池。
2019-08-0314 - Jxin打卡,转眼已过大半,感谢老师一致以来的分享。棒棒的。
作者回复: 同样感谢你们一路以来的坚持和支持。
2019-08-034 - 尔冬橙老师会讲数据库调优么?
作者回复: 下一讲开始讲到数据库调优了,欢迎一起学习成长。
2019-08-033 - 失火的夏天老师我问一下,内部类和静态内部类的区别是什么,哪里有不同,我看jdk里map的node,还有list的node都是静态的。之前有看到设置成静态是为了防止内存泄露,但是没有想明白是为什么
作者回复: 我理解的是,静态内部类是一个独立类,只是借用外部类来隐藏自己。跟外部类没有实质性的关系,即内部静态类不需要有指向外部类的引用。 map的node以及list的node都是一个独立类,不属于map和list,但node又想借外部类来存放自己。这种方式也可以防止内存泄漏。 而内部类则不一样,内部类只能在外部类中实例化被使用,属于真正的内部类,属于外部类的一部分,它可以访问外部类的任何成员变量。非静态内部类需要持有对外部类的引用。
2019-08-0342 - suncar老师,请教一个问题。如果在服务器上部署两个应用。是不是JDK应该对应一个应用。单独对 jvm进行优化。我觉得这样的部署话 JVM参数配置相互不影响,性能比较高。不知到这样是否合理?请老师给点建议
作者回复: 这相当于两个JVM,设置的参数是互不影响的。但是还是会存在相互影响的情况,会存在相互竞争一些共享资源的情况,例如CPU,IO等
2019-08-0921 - Liam单例应该作为枚举类型的一个属性,在私有构造方法内创建并初始化,暴露一个获取方法,通过枚举实例去获取单例时会触发单例初始化,这里是否有必要区分懒汉恶汉?谈话关注点不应该在枚举实例上吧
作者回复: 枚举类的域,即代码中的INSTANCE就是我们已经实例化对象的属性了,相当于private static Singleton instance=new Singleton()。 正常的枚举实现是一个饿汉模式,没有懒加载的实现。枚举类的这个可以再仔细思考下。
2019-08-061 - Liam枚举单例这里没看懂,单例不应该是作为枚举类的一个属性,然后在枚举的私有构造方法内实力化
作者回复: 枚举是饿汉模式,也就是在属性中已经实例化了,相当于我们最开始讲的饿汉模式。
2019-08-061 - 风轻扬老师,您在枚举单例的例子。 // 懒汉模式 枚举实现 public class Singleton { INSTANCE;// 不实例化 public List<String> list = null;// list 属性 private Singleton(){// 构造函数 list = new ArrayList<String>(); } // 使用枚举作为内部类 private enum EnumSingleton { INSTANCE;// 不实例化 private Singleton instance = null; private EnumSingleton(){// 构造函数 instance = new Singleton(); } public static Singleton getSingleton(){ return instance;// 返回已存在的对象 } } public static Singleton getInstance(){ return EnumSingleton.INSTANCE.getSingleton();// 返回已存在的对象 } } 问: 枚举类的getSingleton方法不能用static修饰吧? Singleton字段没有被static修饰,getSingleton方法应该引用不到Singlton字段啊? 编译过不去
作者回复: 对的,不用使用static修饰
2019-09-19 - 风轻扬老师,Future设计模式。我自己画了一下类图。感觉这完全是在模拟线程池的submit(Callable callable)的模式啊。我们直接用java的ThreadPoolExcutor。将Per-Thread模式中的任务类,实现Callable接口,然后使用ThreadPoolExcutor.submit(任务类),然后拿到Future,调用它的get方法就行了。干嘛要自己设计呢?
作者回复: 通过动手实现,更透彻的理解Future的实现原理
2019-09-192 - 晓杰老师,枚举单例的懒汉模式写的有问题吧
作者回复: 具体哪里有问题呢?欢迎指出
2019-08-05