zoukankan      html  css  js  c++  java
  • 【JAVA并发编程实战】9、锁分段

    package cn.study.concurrency.ch11;
    
    /**
     * 锁分段
     * @author xiaof
     *
     */
    public class StripedMap {
        //同步策略:就是对数组进行分段上锁,n个节点用n%LOCKS锁保护
        private static final int N_LOCKS = 16;
        private final Node[] buckets;
        private final Object[] locks;
        
        private static class Node
        {
            private String name;
            private Node next;
            private String key;
            private String value;
            public String getValue() {
                return value;
            }
            public void setValue(String value) {
                this.value = value;
            }
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            public Node getNext() {
                return next;
            }
            public void setNext(Node next) {
                this.next = next;
            }
            public String getKey() {
                return key;
            }
            public void setKey(String key) {
                this.key = key;
            }
            
        }
        
        public StripedMap(int numBuckets)
        {
            buckets = new Node[numBuckets];
            //创建对应hash的锁
            locks = new Object[N_LOCKS];
            for(int i = 0; i < N_LOCKS; ++ i)
            {
                locks[i] = new Object();
            }
        }
        
        private final int hash(Object key)
        {
            //取绝对值
            return Math.abs(key.hashCode() % buckets.length);
        }
        
        //get和clear
        public Object get(Object key)
        {
            int hash = hash(key);
            synchronized(locks[hash % N_LOCKS])
            {
                //分段上锁
                for(Node m = buckets[hash]; m != null; m = m.next)
                {
                    if(m.key.equals(key))
                        return m.value;
                }
            }
            
            return null;
        }
        
        /**
         * 清除所有的数据,但是没有要求说要同时获取全部的锁的话,可以进行这样的释放操作
         */
        public void clear()
        {
            for(int i = 0; i < buckets.length; ++i)
            {
                synchronized(locks[i % N_LOCKS])
                {
                    buckets[i] = null;
                }
            }
        }
    }
  • 相关阅读:
    0593. Valid Square (M)
    0832. Flipping an Image (E)
    1026. Maximum Difference Between Node and Ancestor (M)
    0563. Binary Tree Tilt (E)
    0445. Add Two Numbers II (M)
    1283. Find the Smallest Divisor Given a Threshold (M)
    C Primer Plus note9
    C Primer Plus note8
    C Primer Plus note7
    C Primer Plus note6
  • 原文地址:https://www.cnblogs.com/cutter-point/p/6077199.html
Copyright © 2011-2022 走看看