1. 程式人生 > 其它 >Java基礎知識記錄-20220317

Java基礎知識記錄-20220317

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的區別

  1. BeanFactory:負責生產和管理Bean的一個工廠介面,提供一個Spring Ioc容器規範,
  2. 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

ReentrantLock中的狀態變數為什麼不使用AtomicInteger