一、多线程
单核CPU:是没有并发处理的概念,一个核只能同时处理做一件事情。多个事情可以交替执行。
临界资源:某一时刻只能属于一个线程使用。
并发安全问题:多个线程同时去争抢一个临界资源,引发的问题。
单例模式中的线程安全问题:
1、没有if判断的,直接在成员变量那里初始化实例,不会产生线程安全问题,但会产生阻塞的情况。
2、有if判断,在if判断里new一个实例对象,会产生线程安全问题。
3、getSingleton 静态方法加了synchronized 关键字。不会产生线程安全问题。这是 加了一把类锁。
4、synchronized 同步代码块,加的是类锁。synchronized 前后都有if(singleleton == null)的判断,会产生线程安全问题。需要对成员变量singleton 加一个 volatile 关键字:禁止指令重排序。
new Singleleton()时,指令重排序。
开辟空间。
初始化对象,可能该线程还没进行初始化,其他线程就进来了,进行了初始化,那么该线程的对象是不可用的。
赋值。
线程安全的三个特点:
原子性:(一次执行完成)
有序性:(按照一定循序来执行)
可见性:(其他线程也要可以看到这个改变)
赋值操作是原子操作。但是long的赋值不是原子操作。8个字节,分成2个4字节来赋值。
哈希
哈希算法的目的就是为了验证原始数据是否被篡改。
哈希碰撞就是不同的值通过相同的哈希函数生成了相同的哈希值。
哈希碰撞不能够避免。
解决方法:
1.开放地址法:产生碰撞后,往后排就好,直到没有碰撞。
2.再哈希。 发生碰撞,再进行哈希,有可能频繁哈希。
3.链地址法:产生碰撞,相应的桶中形成链表。
哈希表:采用哈希算法将记录存储在一块空间内,这块空间就叫哈希表。
影响哈希表的查找性能因素:
1、哈希函数是否均匀。
2、解决哈希冲突的方法。
3、哈希表的装载因子。