更多面试题
**《350页前端校招面试题精编解析大全》**内容大纲主要包括 HTML,CSS,前端基础,前端核心,前端进阶,移动端开发,计算机基础,算法与数据结构,项目,职业发展等等
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
它在类加载时就创建了实例对象,并且在整个程序的生命周期中始终存在。这种方式的单例模式在多线程环境下是线程安全的,因为实例对象在类加载时就已经创建好了,不会出现多个线程同时创建实例的情况。
// 饿汉单例 ,一定是安全的
class Singleton{
public:
static Singleton* getInstance(){ // 3. 获取类的唯一实例对象的接口方法
return &instance;
}
private:
static Singleton instance; // 2. 定义一个唯一的类的实例对象
Singleton(){ // 1. 构造函数私有化
}
Singleton(const Singleton&) =delete; //4.禁止拷贝构造 Singleton& 引用类型
Singleton& operator= (const Singleton&)=delete; // 5. 禁止赋值函数
};
Singleton Singleton::instance; // 在数据段,main函数启动前,已经初始化好了,但是影响启动时间,构造函数用不了,比如加载文件
int main(){
Singleton *p1 = Singleton::getInstance();
std::cout << p1 << std::endl;
return 0;
}
3. 懒汉模式
懒汉式单例模式是一种延迟实例化的单例模式实现方式,在第一次被调用时才会创建实例对象。与饿汉式单例模式不同,懒汉式单例模式的实例对象在需要时才被创建,因此称为"懒汉"。
class Singleton{
public:
// 是不是可重入函数? 锁+ 双重判断
static Singleton* getInstance(){ // 3. 获取类的唯一实例对象的接口方法
if (instance == nullptr) {
std::lock_guard<std::mutex> lock(mutex);
/*
开辟空间
给instance 赋值
构造对象
*/
if (instance == nullptr) {
instance = new Singleton();
}
}
return instance;
}
private:
/*
volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改。
volatile 提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,
都会直接从变量地址中读取数据。如 果没有 volatile 关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,
如果这个变量由别的程序更新了的话,将出现不一致的现象。所以遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,
从而可以提供对特殊地址的稳定访问。
##########################################################################################
cpu为了加速访问,会将内存的值拷贝一份到寄存器中,加入volatile
*/
static Singleton *volatile instance; // 2. 定义一个唯一的类的实例对象
// 用于保护多线程环境下的线程安全
static std::mutex mutex;
Singleton(){ // 1. 构造函数私有化
}
Singleton(const Singleton&) =delete; //4.禁止拷贝构造 Singleton& 引用类型
Singleton& operator= (const Singleton&)=delete; // 5. 禁止赋值函数
};
Singleton*volatile Singleton::instance = nullptr;
std::mutex Singleton::mutex;
int main(){
Singleton *p1 = Singleton::getInstance();
std::cout << p1 << std::endl;
return 0;
}
class Singleton{
public:
static Singleton* getInstance(){ // 3. 获取类的唯一实例对象的接口方法
static Singleton instance; // 2. 定义一个唯一的类的实例对象
// 函数的静态局部变量的初始化,在汇编指令上已经自动添加线程互斥指令了
return &instance;
}
private:
Singleton(){
}
Singleton(const Singleton&) =delete; //4.禁止拷贝构造 Singleton& 引用类型
Singleton& operator= (const Singleton&)=delete; // 5. 禁止赋值函数
};
3. 可重入函数
可重入函数是指在多线程环境下能够安全地被多个线程同时调用的函数。具体来说,可重入函数满足以下两个条件之一或两者兼具:
前端框架
前端框架太多了,真的学不动了,别慌,其实对于前端的三大马车,Angular、React、Vue 只要把其中一种框架学明白,底层原理实现,其他两个学起来不会很吃力,这也取决于你以后就职的公司要求你会哪一个框架了,当然,会的越多越好,但是往往每个人的时间是有限的,对于自学的学生,或者即将面试找工作的人,当然要选择一门框架深挖原理。
以 Vue 为例,我整理了如下的面试题。
如果你觉得对你有帮助,可以戳这里获取:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
fbf487ac5f0.png)