2018-8-29


今天遇到的问题:
设计模式,主要讲了七种:
分为了六大原则:(总原则)开闭原则

将23种模式分为了三大类型:

创建:工厂模式、抽象工厂模式、单例模式(6种实现方法)
结构:适配器模式、装饰者模式
行为:策略模式


Java 获取Class对象的三种方法:
https://blog.csdn.net/ls4568206/article/details/52494440

Java中的java.lang.Class,简单理解就是为每个java对象的类型标识的类,虚拟机使用运行时类型信息选择正确的执行方法,用来保存这些运行时类型信息的就是Class类。虚拟机为每种类型管理一个独一无二的对象,即Class对象,当类被加载时,对应的Class类型对象会通过调用类加载器中的
defineClass
方法自动构造自动创建。注意Class对象是单实例的,在运行时,如果该Class对象没有创建,虚拟机会自动创建,如果已经存在,就不会创建了。
> 获取Class对象的三种方法:
1.根据对象的引用.getClass()方法获取:MyObject object=new MyObject(); Class c=object.getClass();
2.根据类名.class获取:Class c=MyObject.class;
3.根据Class中的静态方法Class.forName(); Class c=Class.forName(“MyObject”);


Java并发编程学习笔记 深入理解volatile关键字的作用(涉及对内存模型的理解)
https://www.cnblogs.com/daxin/p/3364014.html

volatile有什么作用?引用《java并发编程实战》的解析:

当一个域声明为volatile类型后,编译器与运行时会监视这个变量:它是共享的,而且对它的操作不会与其他的内存操作一起被重排序。volatile变量不会缓存在寄存器或缓存在对其他处理器隐藏的地方。所以,读一个volatile类型的变量时,总会返回由某一线程所写入的最新值。
volatile只能保证内存可见性,并不能保证原子性。


对象和实例的区别
https://www.cnblogs.com/qq641120784/p/8038880.html
抽象类
一般类:使用new关键字实例化对象
实例化对象


异常:
编译时异常(检查性异常):
运行时异常:


面试官所认为的单例模式 https://blog.csdn.net/li563868273/article/details/81143764


尚未理解的地方:

Q1:class的生命周期?
class的生命周期一般来说会经历加载、连接、初始化、使用、和卸载五个阶段
class的加载机制
classloader的双亲委派模型。

Q2:为什么需要volatile?volatile有什么用?
首先要回答可见性,这个是毋庸质疑的,然后可能又会考到java内存模型。
防止指令重排序: 防止new Singleton时指令重排序导致其他线程获取到未初始化完的对象。instance = new
Singleton()这句,这并非是一个原子操作,事实上在 JVM 中这句话大概做了下面 3 件事情。1.给 instance
分配内存2.调用 Singleton 的构造函数来初始化成员变量3.将instance对象指向分配的内存空间(执行完这步 instance
就为非 null 了) 但是在 JVM
的即时编译器中存在指令重排序的优化。也就是说上面的第二步和第三步的顺序是不能保证的,最终的执行顺序可能是 1-2-3 也可能是
1-3-2。如果是后者,则在 3 执行完毕、2 未执行之前,被线程二抢占了,这时 instance 已经是非 null
了(但却没有初始化),所以线程二会直接返回 instance,然后使用,然后报错。 顺便也可以说下volatie原理用内存屏障.


猜你喜欢

转载自blog.csdn.net/AriesTina/article/details/82184816