目錄
一、方法局部變量的訪問
1.生命周期
1.1方法生命周期
1.2匿名實例生命周期
1.3生命超時性
2.變量捕獲
2.1按值捕獲
2.1.1值捕獲優勢
2.1.1.1生命及時訪問
2.1.1.2線程安全
2.1.2常量值捕獲優勢
2.2按引用捕獲
引用捕獲風險
(1)生命超時訪問
(2)線程不安全
二、外部類成員變量的訪問
1.生命周期
1.1非靜態成員
1.2靜態成員
1.3生命及時性
2.引用訪問
2.1非靜態匿名類的引用訪問
2.2靜態匿名類的引用訪問
3.線程安全問題
一、方法局部變量的訪問
1.生命周期
1.1方法生命周期
方法的生命周期 從方法調用開始 到?方法的最后一行執行完結束
1.2匿名實例生命周期
匿名內部類創建的 實例對象的生命周期 取決于對象的引用情況:
對象被創建后,其生命周期 就獨立于 創建它們的方法,當實例對象引用 傳遞到其它線程或方法里 繼續引用該對象時,即使創建方法的生命周期結束,銷毀了它里面的 該實例對象的引用,實例對象 仍然可能在其它地方 被引用而繼續存在,生命周期可以比創建方法的生命周期長
1.3生命超時性
匿名內部類 在方法里面 定義類結構,實例對象的生命周期 可能比 局部變量的生命周期長,代表著實例對象的匿名內部類 可能會生命超時地 懸空訪問 方法局部變量
2.變量捕獲
匿名內部類 在方法中進行?定義類結構與創建實例,在方法中定義類結構時,會將局部方法的變量 復制捕獲進內部類結構中 作成員變量 進行訪問
2.1按值捕獲
Java的匿名內部類 捕獲所在創建方法的局部變量時,只復制捕獲 方法局部變量的 final常量/等效final變量的 常量值 到內部類 作為新增的副本成員保存
2.1.1值捕獲優勢
2.1.1.1生命及時訪問
復制捕獲值 入副本成員?避免了 創建方法局部變量的生命 可能更短提前銷毀 而造成的懸空訪問的問題
2.1.1.2線程安全
同時如果一個方法中 定義有許多線程的匿名內部類,每個內部類 將同個方法的局部變量復制到各自內部類里面的 獨立副本成員中,就不會形成 并發修改?同一外部方法局部變量 而造成線程安全問題
2.1.2常量值捕獲優勢
復制捕獲final常量值 入副本常量成員,常量在內部無法修改,避免了在內部修改副本成員變量?而外部方法局部變量實際不會改變的 可能錯亂對應問題
2.2按引用捕獲
C++的Lambda表達式捕獲變量時,可以復制捕獲 變量引用 入副本成員引用變量
引用捕獲風險
(1)生命超時訪問
在Lambda表達式內部 就能引用修改外部變量,要確保 實例對象的生命周期 最好不要超過 局部變量的作用域,可以通過延長局部變量生命周期 或限制Lambda不能訪問已銷毀的局部變量 來避免懸空引用問題
(2)線程不安全
當函數中定義多個 線程的匿名內部類時,要用同步機制 確保 多線程并發修改共同局部變量的 線程安全
二、外部類成員變量的訪問
1.生命周期
1.1非靜態成員
匿名內部類實例存在時,其內部就存儲著 外部類的this引用,外部類就不可能被銷毀,生命周期安全地 訪問外部類所有成員
1.2靜態成員
關于類的實例還在,類就不會被卸載,匿名內部類實例的生命周期 一定小于 外部類的生命周期,生命周期安全地 訪問外部類的靜態成員
1.3生命及時性
外部類成員變量的生命周期 一定比 匿名內部類實例的生命周期長,代表著實例對象的匿名內部類 一定生命及時地 安全訪問 外部類的成員變量
2.引用訪問
外部類成員變量的生命周期 一定比匿名內部類實例的生命周期長,所以就不使用 復制捕獲變量訪問,選擇直接引用訪問
2.1非靜態匿名類的引用訪問
在持有外部類實例引用的 非靜態方法里面 定義匿名內部類的 類結構,內部類持有 外部類實例對的 this引用,可以訪問外部類的所有成員
2.2靜態匿名類的引用訪問
在靜態方法里面 定義匿名內部類的 類結構,內部類只能訪問外部類的靜態成員
3.線程安全問題
多個匿名線程 并發訪問同一成員變量時 有線程安全問題