原文链接:https://samxiangyu.wordpress.com/2015/02/20/java-concurrency-guardedby/
当阅读Android源码工程的DownloadService类时,我注意到使用了@GuardedBy注解,这是类似于Java关键字synchronized关键字,但使用代替锁。可以这样使用这个注解:
public class foo {
@GuardedBy("this")
public String str;
}
正如我们所看到的,用法是@GuardedBy(lock),这意味着有保护的字段或方法只能在线程持有锁时被某些线程访问。 我们可以将锁定指定为以下类型:
- this : 在其类中定义字段的对象的固有锁。
- class-name.this : 对于内部类,可能有必要消除“this”的歧义; class-name.this指定允许您指定“this”引用的意图。
- itself : 仅供参考字段; 字段引用的对象。
- field-name : 锁对象由字段名指定的(实例或静态)字段引用。
- class-name.field-name : 锁对象由class-name.field-name指定的静态字段引用。
- method-name() : 锁对象通过调用命名的nil-ary方法返回。
- class-name :指定类的Class对象用作锁定对象。
例子:
public class BankAccount {
private Object credential = new Object();
@GuardedBy("credential")
private int amount;
}
在上面的代码片段中,当有人获得了凭据的同步锁定时,可以访问金额,因此,BankAccount中的金额由凭据保护。 让我们给这个类添加一些东西。
public class BankAccount {
private Object credential = new Object();
@GuardedBy("credential")
private int amount;
@GuardedBy("listOfTransactions")
private List<Transaction> listOfTransactions;
}
我们现在有一个在BankAccount的事务列表。 List对象有许多元素,因此它具有对列表中所有元素的引用。 这里我们使用@GuardedBy(“listOfTransactions”)来指定锁与listOfTransactions所引用的对象相关联。 换句话说,有人必须持有所有事务的锁,以便保持此List对象的锁定。