Striped Locks用于实现在更细粒度的锁控制和性能之间平衡。Guava是Google提供的Java开发工具类集合,有使用Java开发和专用Android开发的版本,里面很多工具类对提高开发效率和质量很有帮助。
有这样一个场景,有100个袋子,每个袋子里面有位置颜色的未知个数的小球。现在有10个线程,检查如果没有某种颜色的小球就添加进去,保证每个袋子的中每个小球的颜色唯一。如果不使用线程锁控制访问,就会出现几个线程同时检查某个袋子,发现没有某个颜色的,同时添加几个相同颜色的小球。这时就需要对访问袋子的代码加锁。
- 方法一:
所有的袋子使用同一个锁。这显然带来一个问题,就是效率低下。这和一个线程访问没啥区别。 - 方法二:
每个袋子都用一个锁。这样虽然解决了之前效率的问题,但是这么多个锁会带来性能问题。 - 折衷办法:
使用固定数量的锁,每个锁控制指定数量的袋子。这样算是对前面两种方案的折衷。
由此引出Guava库中的Striped
。见代码:
public class StripLockTest {
public void test() {
Striped<Lock> lockStriped = Striped.lock(10);
ArrayList<Bag> bags = new ArrayList<>();
for (Bag bag : bags) {
Lock lock = lockStriped.get(bag.id);
lock.lock();
//do your work
lock.unlock();
}
}
class Bag {
String id;
public String getId() {
return id;
}
}
}
至于Striped
是如何根据锁的个数来分配各个对象的,也就是lockStriped.get(bag.id);
这里是如何获取锁的。追踪源码可知是根据传入对象的Hash值来获取的。
网友评论