1单例模式:
1.1 单例模式的由来
- 将构造方法设置为私有,这样所有的想要这个类实例的只能调用该类提供的静态方法来产生唯一的实例。
- 在该类内部提供一个静态方法,在这个静态方法里面我们可以先通过判断实例是否为空,不为空就返回这个引用,类保持的引用为空就创建一个新实例赋给引用,再返回它。
1.2 单例模式的应用场景
windows下的回收站,系统只会提供一个全局的回收栈,当打开一个回收站不关闭再重新打开回收站的话,也不会再次打开一个回收站,而是显示原来的回收站。避免了资源的损耗。
1.3 三种单例模式的代码实现
1.3.1 饿汉式单例
public class HungrySingleTon {
private static HungrySingleTon hungrySingleTon= new HungrySingleTon();
private HungrySingleTon(){}
public HungrySingleTon provide(){
return hungrySingleTon;
}
}
存在问题:可能会因为没有被使用而造成内存浪费。
1.3.2 懒汉式单例:
public class LazySingleTon {
private static LazySingleTon lazySingleTon = null;
private LazySingleTon(){}
public LazySingleTon lazySingleTon(){
if (lazySingleTon==null){
lazySingleTon = new LazySingleTon();
}
return lazySingleTon;
}
}
1.3.3 安全的懒汉式:
public class TwoLockSingleTon {
private static volatile TwoLockSingleTon twoLockSingleTon = null;
private TwoLockSingleTon(){}
public TwoLockSingleTon provide(){
if (twoLockSingleTon == null){
synchronized (TwoLockSingleTon.class){
twoLockSingleTon = new TwoLockSingleTon();
}
}
return twoLockSingleTon;
}
}
2 进程间通信
进程间通信主要包含三种,分别是管道、系统IPC、套接字(Socket)。
2.1 管道
- 普通管道pipe:单工通信,多用有血缘关系的进程例如父子进程,兄弟进程。
- 流管道s_pipe:半双工通信(不能同时传输),管道两边可以双向传输。
- 命名管道name_pipe:用于多种不认识的进程相互通信。
2.2 系统IPC
- 消息队列,是由消息的链表,存放在内核中再由消息队列标识符标识,克服了信息传输量少、管道只能承载无格式字节流以及缓存区大小受限等缺点。
- 信号量,信号量是一个计数器,控制多个进程对共享资源的访问。常做为一种锁机制,防止某个进程在访问共享资源的时候,其他进程也访问该资源,因此主要作为不同线程间或同一进程下不同线程的之间的同步方式。
- 信号:用于通知某进程什么事件发生了。
- 共享内存,共享内存就是映射某一段能被其他进程访问的内存,该内存由一个进程创建,可以被多个进程访问。共享内存是最快的IPC方式。它是针对其他IPC方式运行效率低专门设计的。往往和其他通信机制如信号量配合使用,来实现进程间的同步和通信。
2.3 套接字
可用于不同机器间的进程通信。
3 cpu调度的基本单位
cpu调度和分配的基本单位是线程。线程是操作系统能够调度运行的最小单位。
一条线程指的是进程中一个单一顺序的控制流。一个进程可以并发执行多条线程。每条线程并行执行不同的任务。
4 判断传值是否为2的幂次方
//方法一:遍历val/2,如果val/2==0的话,再判断%2是否为0,是返回true,不是返回false。
public boolean judge(int value){
if(value/2==0){
if (value%2==0){
return true;
}
}
//对于求出来的数要向上加上0.5,因为可能求出来的值小数部分可能是0.5,避免这类的影响。
return judge((int)((value/2)+0.5));
}
//方法二:在函数中保留一个足够大的2的幂次方。除以传进来的数,然后再看小数部分是否等于0。
public boolean judge1(int value){
//mod要设置一个足够大的double类型的2的幂次方数
double mod = 1024.0;
//这里默认的是这个数小于mod,实际情况还要对大小进行判断。
//将mod除以传进来的value值,如果两者都是2的幂次方,则小数位必然为0,如果小数位不为0的话,则判断为不是2的幂次方
double a = ((mod/value)-((int)mod/value));
if (a==0.0){
return true;
}
return false;
}
5 面试总结
- 在面对面试官的时候,尽管面试官很温和,但是自己还是很慌,手和嘴都在抖,经历不足,心里发慌。
- 在问到学过的东西的时候不能用专业化的语言把他表示出来。
- 在设计算法的时候,算法逻辑不够清晰,让人迷惑。用了死循环,没有用简洁的递归方式。
- 设计程序的时候没有想到要用线程安全的方式。
- 在表达的时候不能清晰勇敢的表达自己想要说的话。
- 在面对面试官的提示,没有很好的把握住,并且太容易放弃了,应该仔细考虑的。