可以简单来说,GuardedBy注解是用来限制及解释被注解对象使用时,需要与synchronized关联。

synchronized同步锁的概念去查阅资料即可,网上有很多。
GuardedBy注解定义在AndroidX框架中androidx.annotatio的包下,定义如下:

/*** Denotes that the annotated method or field can only be accessed when holding the referenced lock.* <p>* Example:* <pre>* final Object objectLock = new Object();** {@literal @}GuardedBy("objectLock")* volatile Object object;** Object getObject() {*     synchronized (objectLock) {*         if (object == null) {*             object = new Object();*         }*     }*     return object;* }</pre>*/
@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.CLASS)
public @interface GuardedBy {String value();
}

GuardedBy注解有多个定义,分别限制和解释被注解对象的使用需要在什么情况下使用synchronized。

GuardedBy注解定义情况如下:

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对象用做锁定对象

拿Glide开源项目来举例解释

举例1 GuardedBy(“this”)

  @GuardedBy("this")@Nullableprivate BitmapPreFiller bitmapPreFiller;

那么要使用bitmapPreFiller时,bitmapPreFiller需要在synchronized 锁类对象级别的代码块中,如:

  public synchronized void preFillBitmapPool(@NonNull PreFillType.Builder... bitmapAttributeBuilders) {if (bitmapPreFiller == null) {DecodeFormat decodeFormat =defaultRequestOptionsFactory.build().getOptions().get(Downsampler.DECODE_FORMAT);bitmapPreFiller = new BitmapPreFiller(memoryCache, bitmapPool, decodeFormat);}bitmapPreFiller.preFill(bitmapAttributeBuilders);}

上面这个方面是synchronized锁成员方法,属于synchronized 锁类对象级别。

举例2 GuardedBy(field-name)

  @GuardedBy("managers")private final List<RequestManager> managers = new ArrayList<>();

那么要使用managers对象时,需要将managers在synchronized锁managers对象的代码块中,如:

  public void trimMemory(int level) {Util.assertMainThread();synchronized (managers) {for (RequestManager manager : managers) {manager.onTrimMemory(level);}}memoryCache.trimMemory(level);bitmapPool.trimMemory(level);arrayPool.trimMemory(level);}
  boolean removeFromManagers(@NonNull Target<?> target) {synchronized (managers) {for (RequestManager requestManager : managers) {if (requestManager.untrack(target)) {return true;}}}return false;}void registerRequestManager(RequestManager requestManager) {synchronized (managers) {if (managers.contains(requestManager)) {throw new IllegalStateException("Cannot register already registered manager");}managers.add(requestManager);}}void unregisterRequestManager(RequestManager requestManager) {synchronized (managers) {if (!managers.contains(requestManager)) {throw new IllegalStateException("Cannot unregister not yet registered manager");}managers.remove(requestManager);}}

synchronized 关键字与GuardedBy注解的关系相关推荐

  1. Java 多线程(六) synchronized关键字详解

    多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题. 同步机制可以使用synchronized关键字实现. 当synchroniz ...

  2. Java多线程闲聊(六):synchronized关键字

    Java多线程闲聊(六):synchronized关键字 前言 这篇文章我会在博客置顶,为什么呢?因为,三篇引用的文章写得太好了,我害怕后面找不到,看不到,然后忘了! 让我想想,感觉昨天的前言把最近肚 ...

  3. java同步关键字_Java中synchronized关键字修饰方法同步的用法详解

    Java的最基本的同步方式,即使用synchronized关键字来控制一个方法的并发访问. 每一个用synchronized关键字声明的方法都是临界区.在Java中,同一个对象的临界区,在同一时间只有 ...

  4. java同步锁synchronized_Java对象锁和类锁全面解析(多线程synchronized关键字)

    本文主要是将synchronized关键字用法作为例子来去解释Java中的对象锁和类锁.特别的是希望能帮大家理清一些概念. 一.synchronized关键字 synchronized关键字有如下两种 ...

  5. 从分布式锁角度理解Java的synchronized关键字

    分布式锁 分布式锁就以zookeeper为例,zookeeper是一个分布式系统的协调器,我们将其理解为一个文件系统,可以在zookeeper服务器中创建或删除文件夹或文件.设D为一个数据系统,不具备 ...

  6. java中存在对多个对象加锁的情况_Java对象锁和类锁全面解析(多线程synchronized关键字)...

    最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...

  7. JAVA并发编程3_线程同步之synchronized关键字

    在上一篇博客里讲解了JAVA的线程的内存模型,见:JAVA并发编程2_线程安全&内存模型,接着上一篇提到的问题解决多线程共享资源的情况下的线程安全问题. 不安全线程分析 public clas ...

  8. cookie里面用到的关键字_晓龙吊打面试官系列:synchronized关键字入门(同步方法与同步代码块)...

    文章目录 一. 线程安全问题 二.synchronized简介 1) 原子性 2) 可见性 3) 有序性 4)可重入 1. 什么是synchronized 2.什么是同步 3.synchronized ...

  9. Java多线程学习(二)synchronized关键字(1)

    转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...

  10. synchronized关键字实现同步

    synchronized关键字的使用 Java语言提供了synchronized关键字,可以给方法或代码块进行加锁,从而实现同步. synchronized关键字取的锁都是对象锁,而不是把代码块或方法 ...

最新文章

  1. Open WebRTC Toolkit实时视频分析系统
  2. linux shell中fork、source、exec的区别
  3. BootstrapTable冻结表头(一)
  4. 通向财务自由之路01_导读
  5. 重新配对_最容易旧情复燃的星座配对,念念不忘,重新在一起
  6. access vba 常量数组赋值_09c语言数组详解
  7. 为什么下拉框拉不下来_为什么分手后对方不删除拉黑你,但又不和你复合?
  8. ECCV 2022 | AirDet: 无需微调的小样本目标检测方法
  9. 独立游戏如何对接STEAM SDK
  10. 核心期刊为什么难发?
  11. 计算机软件硬件和应用知识论文,有关计算机及应用毕业论文
  12. Adobe 奇葩续费机制被网友狂喷:中途取消计划必须付费 50%
  13. echarts饼图:实现多层图表同步自动轮播,鼠标悬浮时停止轮播,移出鼠标后重新开始轮播效果
  14. 信息收集(成功就是99%的运气+1%的搜索引擎)
  15. c#推箱子小游戏代码_C语言实现推箱子小游戏
  16. 将视频文件旋转90°的方法
  17. mysql多线程复制crash_MySQL 并行复制(MTS) 从库发生异常crash分析
  18. illumina不愧是二代测序无冕之王
  19. mongoose 更新保存数据的时候自动插入__v
  20. linux pppd ip up 脚本,pppd拨号脚本配置

热门文章

  1. JUnit之Rule的使用
  2. 成像系统光照度(相机成像辐射传输)
  3. 谷歌默认打开hao123
  4. Java里线程的隔离方式_线程隔离浅析
  5. 修改Cisco交换机ntp服务器,Cisco交换机NTP的配置
  6. 《Head First设计模式》中文版 读书笔记
  7. 纠缠谎言蒙蔽双眼 而真实 已埋没
  8. 国内期货期权保证金计算方式
  9. 修改服务器ssh欢迎界面
  10. 苹果手机电池恢复方法_recover恢复实用教程:苹果手机恢复误删照片的几种方法...