天天看點

Thread專題(14) - 自定義Annocation

此文被筆者收錄在系列文章 ​​​架構師必備(系列)​​ 中,這一章的注解是非官方的注解,屬于一點擴充知識。自從java有了注解能力後,在有些時候可以考慮用注釋來代替文檔。

@GuardedBy和@ThreadSafe等Annotation用來展現如何将線程安全性的保證和同步政策進行文檔化。下面會介紹一點經常用到的Annotation。

類Annotation

我們用到了3個類級Annotation來描述類的可預期的線程安全性保證:

  • ✴@Immutable:不可變的,并包含了@ThreadSafe。
  • ✴@NotThreadSafe:是可選的,如果類沒有被标明是線程安全的,就無法肯定它是不是線程安全的,但是如果想标它不是線程安全的,就标為@ NotThreadSafe。
  • ✴@ThreadSafe:線程安全的。

這些 Annotation相對是非侵入的,這對使用者和維護者都是有益的,使用者可以立即看出一個類是否是線程安全的,維護者也可以直接檢查類是否遵守了線程安全性保證。 Annotation對于第三個利益即得者也是有用的:工具。靜态的代碼分析工具可以有能力對代碼進行驗證,看它是否遵守了由Annotation指定的契約,比如标明為@Immutable的類是否真正不可變的。

域Annotation和方法Annotation

  • ✴@GuardedBy(“this”):是指包含在對象中的内部鎖(方法或域是這個對象的一個成員)。
  • ✴@GuardedBy(“fieldName”):是指與filedName引用的對象相關聯的鎖,它或者是一個隐式鎖或一個顯式鎖。
  • ✴@GuardedBy(“ClassName.fieldName”):類似于@GuardedBy(“fieldName”),不過所引用的鎖對象是存儲在另一個類中的靜态域。
  • ✴@GuardedBy(“methodName()”):是指鎖對象是methodName()方法的傳回值
  • ✴@GuardedBy(“ClassName.class”)::是指className類的直接對象。

繼續閱讀