Java基礎知識記錄-20220317
阿新 • • 發佈:2022-03-17
Java基礎知識記錄-20220317
spring Bean的生命週期
1.例項化Bean例項
2.設定物件屬性
3.檢查Aware的相關介面並設定相關依賴
4.BeanPostProcessor前置處理
5.是否實現InitializingBean介面
6.是否配置自定義的init-method
7.BeanPostProcessor後置處理
8.註冊Destruction相關回調介面
9.是否實現DisposableBean介面
10.是否配置自定義的destory-method
spring中都用到了哪些設計模式
1.簡單工廠: BeanFactory
2.工廠方法: FactoryBean
3.單例模式: DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean)
4.介面卡模式: HandlerAdapter
5.裝飾器模式
6.代理模式
7.觀察者模式 spring中的事件驅動
8.策略模式 Resource
9.模版方法 JdbcTemplate
spring中的單例是如何實現的
相關方法
org.springframework.beans.factory.BeanFactory#getBean(java.lang.String) org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String) org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String) org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean)
單例獲取方法
@Nullable protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) { synchronized (this.singletonObjects) { singletonObject = this.earlySingletonObjects.get(beanName); if (singletonObject == null && allowEarlyReference) { ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName); if (singletonFactory != null) { singletonObject = singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); } } } } return singletonObject; }
BeanFactory和FactoryBean的區別
- BeanFactory:負責生產和管理Bean的一個工廠介面,提供一個Spring Ioc容器規範,
- FactoryBean: 一種Bean建立的一種方式,對Bean的一種擴充套件。對於複雜的Bean物件初始化建立使用其可封裝物件的建立細節。
阻塞佇列是執行緒安全的嗎
阻塞佇列是執行緒安全的,因為在它的實現類中獲取資料和插入資料都是加ReentrantLock鎖的
//以ArrayBlockingQueue 的take和put方法為例
public E take() throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (count == 0)
notEmpty.await();
return dequeue();
} finally {
lock.unlock();
}
}
public void put(E e) throws InterruptedException {
checkNotNull(e);
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();
try {
while (count == items.length)
notFull.await();
enqueue(e);
} finally {
lock.unlock();
}
}
ReentrantLock底層都用到了哪些東西
AQS 、CLH 、CAS
ReentrantLock 是可重入鎖嗎
ReentrantLock是可重入鎖
ReentrantLock中的公平鎖和非公平鎖的區別
公平鎖和非公平鎖,主要是在方法 tryAcquire 中,是否 有 !hasQueuedPredecessors() 判斷
//公平鎖
protected final boolean tryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
//公平鎖和非公平鎖的區別,公平鎖會判斷當前佇列中沒有其他執行緒在等待鎖資源
if (!hasQueuedPredecessors() &&
compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0)
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
}
//非公平鎖
final boolean nonfairTryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
if (compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0) // overflow
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}
ReentrantLock中的Sync重寫了AQS的哪兩個方法
//這是獨佔式釋放同步狀態的方法,讓那些等待獲取同步狀態的執行緒能夠有機會獲取同步狀態
java.util.concurrent.locks.AbstractQueuedSynchronizer#tryRelease
//這個方法用來判斷當前同步器是否在獨佔模式下被執行緒佔用,它會取出佔用的執行緒和當前執行緒做個比較,看下是否相等。
java.util.concurrent.locks.AbstractQueuedSynchronizer#isHeldExclusively