我有一组资源,它们是Resource类的实例。系统中有作业在运行时进入。每个作业都需要一组这些资源,并且必须独占使用它继续进行所需的所有资源。也就是说,为了让作业能够启动,它必须获取它需要的所有资源的锁,并在完成后释放它获取的所有这些锁。因此,除非它需要的所有资源的所有锁都可用,否则作业无法开始其处理。
作业需要的资源在运行时之前是未知的。作业需要的资源列表作为Collection ArrayList<Resource>.
这样做的一种方法是,在run()每个作业线程的方法中,我可以同步“这个”作业所需的所有资源的锁。
synchronized (resource1) {
synchronized (resource2) {
...
}
}
但这是硬编码并且无法完成,因为作业所需的资源仅在运行时才知道。
我能想到的另一种方法是将资源放在集合结构中,这样,当获取该集合的锁时,该集合中所有条目的锁也会被获取,并且其他任何人都无法使用。
有Collections.synchronizedList()。但是,它只锁定List,而不锁定列表中的对象。
如何才能做到这一点?
繁花如伊
翻过高山走不出你
相关分类