我有一个数据结构,它的成员不是线程安全的,调用者需要锁定资源,以便适当地阅读。下面是一个最小的代码示例:
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 }
为了确保调用者知道需要锁定资源,我希望IDE对使用@RequiresReadLock
注解并且没有使用readLock
块包围的任何成员发出警告。有没有办法在IntelliJ中执行此操作,而不需要为IDE编写自定义插件?
1条答案
按热度按时间7tofc5zh1#
我认为这是一种黑客,但使用context receivers可能会工作。我不认为他们打算以这种方式使用。
您可以声明一个伪
object
作为上下文接收器,并将其作为上下文接收器添加到属性中:然后在
readLock
中,传递object
:备注:
nonThreadSafeMember
,则会给予错误:nonThreadSafeMember
,而无需获取读锁定,方法是执行以下操作:但是很难 * 意外 * 写这样的东西,我认为这是你试图防止的。
readLock
中调用另一个函数,并且你想在那个函数中访问nonThreadSafeMember
,你也应该用context(ReadLock)
来标记那个函数。内容接收端会透过传播。