如何让IntelliJ对未在readLock块中访问的@RequiresReadLock成员告警?
我有一个包含非线程安全成员的数据结构,调用者需要按需对资源加锁以进行读写操作。以下是极简代码示例:
class ExampleResource : LockableProjectItem { override val readWriteLock: ReadWriteLock = ReentrantReadWriteLock() @RequiresReadLock val nonThreadSafeMember: String = "" } interface LockableProjectItem { val readWriteLock: ReadWriteLock } fun <T : LockableProjectItem, Out> T.readLock(block: T.() -> Out): Out { try { readWriteLock.readLock().lock() return block(this) } finally { readWriteLock.readLock().unlock() } } fun <T : LockableProjectItem, Out> T.writeLock(block: T.() -> Out): Out { try { readWriteLock.writeLock().lock() return block(this) } finally { readWriteLock.writeLock().unlock() } } annotation class RequiresReadLock
调用ExampleResource.nonThreadSafeMember的正确方式如下:
val resource = ExampleResource() val readResult = resource.readLock { nonThreadSafeMember }
为确保调用者知晓需锁定资源,我希望IntelliJ能对所有标注@RequiresReadLock且未被readLock块包裹的成员发出警告,请问无需编写自定义插件能否实现该需求?
不需要编写自定义插件,可通过IntelliJ IDEA的内置线程安全检查配置实现该需求,具体步骤如下:
关联自定义注解与锁规则
打开IntelliJ设置(File > Settings),导航到Editor > Inspections > Kotlin > Threading issues > Unsafe access to shared mutable state。在检查的配置面板中,找到Guarded by annotations区域,点击Add按钮,输入自定义注解RequiresReadLock,并在Guard condition中选择Method call,填写this.readLock(...)——以此指定必须在readLock方法的lambda块内访问标注的成员。调整检查强度
保存配置后,直接访问@RequiresReadLock标注的成员(未包裹在readLock块中)时,IntelliJ会自动弹出警告。若需要强制开发者修正,可将该检查的严重级别从Warning调整为Error。扩展适配写锁场景
如果需要为writeLock方法配置类似约束,可新增@RequiresWriteLock注解,重复上述步骤将其与this.writeLock(...)关联即可。
内容的提问来源于stack exchange,提问作者vatbub

