常用的幾種單例模式
懶加載線程安全
public class Manager {
private Manager instance = null;
Manager getIntance() {
if (instance == null) {
sycnronize (this) {
if (instance == null) {
instance = new Manager();
return instance;
}
}
}
return instance;
}
private Manager(){
}
}
餓漢模式
public class Manager {
private static final Manager instance = new Manager();
private Manager(){
}
public static void getInstance() {
return instance;
}
}
懶漢模式
public class Manager {
private Manager(){
}
public static void getInstance() {
return SingletonHolder.instance;
}
private static class SingletonHolder {
public static final Manager instance = new Manager();
}
}
生產(chǎn)者消費(fèi)者模式
semapore實(shí)現(xiàn)
https://blog.csdn.net/mm_bit/article/details/50010623
// 非滿鎖
final Semaphore notFull = new Semaphore(10);
// 非空鎖
final Semaphore notEmpty = new Semaphore(0);
// 核心鎖
final Semaphore mutex = new Semaphore(1);blockingqueue無(wú)需同步鎖
https://www.cnblogs.com/fankongkong/p/7339848.html
private BlockingQueue resourceQueue = new LinkedBlockingQueue(10);
resourceQueue.put(1);
resourceQueue.take();lock/condition/await/signalAll
核心防沖突鎖 Lock lock = new ReentrantLock();
是否滿的條件 Condition producerCondition = lock.newCondition();
非空的條件 ondition consumerCondition = lock.newCondition();
HashMap的內(nèi)部結(jié)構(gòu)籍凝? 內(nèi)部原理?
https://www.cnblogs.com/stevenczp/p/7028071.html
JDK1.7中
使用一個(gè)Entry數(shù)組來(lái)存儲(chǔ)數(shù)據(jù),用key的hashcode取模來(lái)決定key會(huì)被放到數(shù)組里的位置苗缩,如果hashcode相同饵蒂,或者h(yuǎn)ashcode取模后的結(jié)果相同(hash collision),那么這些key會(huì)被定位到Entry數(shù)組的同一個(gè)格子里酱讶,這些key會(huì)形成一個(gè)鏈表退盯。
在hashcode特別差的情況下,比方說(shuō)所有key的hashcode都相同,這個(gè)鏈表可能會(huì)很長(zhǎng)得问,那么put/get操作都可能需要遍歷這個(gè)鏈表
也就是說(shuō)時(shí)間復(fù)雜度在最差情況下會(huì)退化到O(n)
JDK1.8中
使用一個(gè)Node數(shù)組來(lái)存儲(chǔ)數(shù)據(jù)囤攀,但這個(gè)Node可能是鏈表結(jié)構(gòu),也可能是紅黑樹(shù)結(jié)構(gòu)
如果插入的key的hashcode相同宫纬,那么這些key也會(huì)被定位到Node數(shù)組的同一個(gè)格子里焚挠。
如果同一個(gè)格子里的key不超過(guò)8個(gè),使用鏈表結(jié)構(gòu)存儲(chǔ)漓骚。
如果超過(guò)了8個(gè)蝌衔,那么會(huì)調(diào)用treeifyBin函數(shù),將鏈表轉(zhuǎn)換為紅黑樹(shù)蝌蹂。
那么即使hashcode完全相同噩斟,由于紅黑樹(shù)的特點(diǎn),查找某個(gè)特定元素孤个,也只需要O(log n)的開(kāi)銷
也就是說(shuō)put/get的操作的時(shí)間復(fù)雜度最差只有O(log n)