Spring中的@Lazy註解簡析_阻塞隊列被異步消費怎麼保持順序呢?_如何優雅的停止一個線程

@Lazy 的屬性

Spring IoC (ApplicationContext) 容器一般都會在啓動的時候實例化所有單實例 bean 。如果我們想要
Spring 在啓動的時候延遲加載 bean,即在調用某個 bean 的時候再去初始化,那麼就可以使用 @Lazy 註解。

value 取值有 true 和 false 兩個 默認值爲 true

true 表示使用 延遲加載, false 表示不使用,false 純屬多餘,如果不使用,不標註該註解就可以了。
Person 類

public class Person {

    private String name;
    private Integer age;
    public Person() {

    }

    public Person(String name, Integer age) {
        System.out.println(" 對象被創建了.............");
        this.name = name;
        this.age = age;
    }
  // 省略 getter setter 和 toString 方法
}

配置類 不標註 @Lazy 註解

public class LazyConfig {
    @Bean
    public Person person() {
        return new Person("李四", 55);
    }
}

測試

    @Test
    public void test5() {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(LazyConfig.class);
    }

不獲取 bean , 看控制檯是否會打印。如果有打印,代表調用了構造器。

結果

img

在配置類打上 @Lazy 註解

public class LazyConfig {
    @Lazy
    @Bean
    public Person person() {
     return new Person("李四", 55);
    }
}

再來看輸出結果


沒有打印語句,對象沒有調用構造器,那麼方法也就沒有被創建。
@Lazy(value = false) 或者 @Lazy(false) 那麼對象會在初始化的時候被創建


@Lazy註解註解的作用主要是減少springIOC容器啓動的加載時間

當出現循環依賴時,也可以添加@Lazy

阻塞隊列被異步消費怎麼保持順序呢?

堵塞隊列是一個符號FIFO的隊列,使用condition條件維護了兩個等待隊列,如下圖

 

 任務隊列滿了,生產者會被按照先進先出的順序放在鏈表裏面,消費者也是如此。

對於堵塞隊列的消費過程有兩種情況,第一種是堵塞隊列裏面已經包含了很多任務,這個時候啓動消費者線程去消費的時候,

他的有序性是通過加鎖來實現的,每個消費者線程去堵塞隊列裏面獲取任務的時候,必須先要去獲得排它鎖,如果多個消費者如果堵塞

隊列裏面沒有任務而堵塞這個時候線程是按照FIFO的一個順序存儲到一個condition條件等待隊列裏面,按照FIFO的順序被喚醒。

停止線程

 

使用stop會產生的問題

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章