美文网首页
Guava library 中的 Striped Locks

Guava library 中的 Striped Locks

作者: From64KB | 来源:发表于2020-11-16 15:08 被阅读0次

Striped Locks用于实现在更细粒度的锁控制和性能之间平衡。Guava是Google提供的Java开发工具类集合,有使用Java开发和专用Android开发的版本,里面很多工具类对提高开发效率和质量很有帮助。

有这样一个场景,有100个袋子,每个袋子里面有位置颜色的未知个数的小球。现在有10个线程,检查如果没有某种颜色的小球就添加进去,保证每个袋子的中每个小球的颜色唯一。如果不使用线程锁控制访问,就会出现几个线程同时检查某个袋子,发现没有某个颜色的,同时添加几个相同颜色的小球。这时就需要对访问袋子的代码加锁。

  1. 方法一:
    所有的袋子使用同一个锁。这显然带来一个问题,就是效率低下。这和一个线程访问没啥区别。
  2. 方法二:
    每个袋子都用一个锁。这样虽然解决了之前效率的问题,但是这么多个锁会带来性能问题。
  3. 折衷办法:
    使用固定数量的锁,每个锁控制指定数量的袋子。这样算是对前面两种方案的折衷。

由此引出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值来获取的。

相关文章

网友评论

      本文标题:Guava library 中的 Striped Locks

      本文链接:https://www.haomeiwen.com/subject/iveabktx.html