最后
今天的文章可谓是积蓄了我这几年来的应聘和面试经历总结出来的经验,干货满满呀!如果你能够一直坚持看到这儿,那么首先我还是十分佩服你的毅力的。不过光是看完而不去付出行动,或者直接进入你的收藏夹里吃灰,那么我写这篇文章就没多大意义了。所以看完之后,还是多多行动起来吧!
可以非常负责地说,如果你能够坚持把我上面列举的内容都一个不拉地看完并且全部消化为自己的知识的话,那么你就至少已经达到了中级开发工程师以上的水平,进入大厂技术这块是基本没有什么问题的了。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
懒汉式单例模式是一种延迟实例化的单例模式实现方式,在第一次被调用时才会创建实例对象。与饿汉式单例模式不同,懒汉式单例模式的实例对象在需要时才被创建,因此称为"懒汉"。
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. 可重入函数
可重入函数是指在多线程环境下能够安全地被多个线程同时调用的函数。具体来说,可重入函数满足以下两个条件之一或两者兼具:
- 函数不使用静态变量或全局变量(包括静态局部变量),或者使用这些变量时通过互斥锁或其他同步机制来保护变量的访问。
- 函数使用的静态变量或全局变量只读,或者在使用时通过互斥锁或其他同步机制来保护变量的访问。
在多线程环境下,如果一个函数不满足上述条件之一,那么当多个线程同时调用该函数时,就会出现数据竞争和不确定的行为,导致程序的行为变得不可预测,甚至引发崩溃。
编写可重入函数的关键是避免共享可变状态,或者在共享状态时采取适当的同步措施,以确保线程安全性。这可能涉及到使用局部变量而不是静态变量或全局变量,使用线程局部存储(Thread-Local Storage,TLS)等技术来避免共享状态,以及使用互斥锁、信号量、原子操作等同步机制来保护共享状态的访问。
#include <iostream>
#include <mutex>
// 可重入函数示例
int reentrantFunction(int value) {
// 局部变量,线程私有,不会造成数据竞争
int result = 0;
result += value * 2;
return result;
}
int main() {
// 多个线程同时调用可重入函数
int result1 = reentrantFunction(5);
int result2 = reentrantFunction(10);
// 打印结果
std::cout << "Result 1: " << result1 << std::endl;
std::cout << "Result 2: " << result2 << std::endl;
### 总结
面试前要精心做好准备,简历上写的知识点和原理都需要准备好,项目上多想想难点和亮点,这是面试时能和别人不一样的地方。
还有就是表现出自己的谦虚好学,以及对于未来持续进阶的规划,企业招人更偏爱稳定的人。
万事开头难,但是程序员这一条路坚持几年后发展空间还是非常大的,一切重在坚持。
**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**
**前端面试题汇总**
![](https://img-blog.csdnimg.cn/img_convert/42728594459506983a38ca2b86545fc6.png)
**JavaScript**
![](https://img-blog.csdnimg.cn/img_convert/7796de226b373d068d8f5bef31e668ce.png)
**前端资料汇总**
![](https://img-blog.csdnimg.cn/img_convert/6e0ba223f65e063db5b1b4b6aa26129a.png)