美文网首页
减少锁的竞争

减少锁的竞争

作者: 史小猿 | 来源:发表于2018-10-26 16:39 被阅读13次
    • 缩小锁的范围
    public synchronized void doSometing(){
       A();
        B();
    }
    改为
    public void doSometing(){
       synchronized(this){
    A()
    };
        B();
    }
    
    • 缩小锁的粒度
    @ThreadSafe
    public class ServerStatusBeforeSplit {
        @GuardedBy("this") public final Set<String> users;
        @GuardedBy("this") public final Set<String> queries;
    
        public ServerStatusBeforeSplit() {
            users = new HashSet<String>();
            queries = new HashSet<String>();
        }
    
        public synchronized void addUser(String u) {
            users.add(u);
        }
    
        public synchronized void addQuery(String q) {
            queries.add(q);
        }
    
        public synchronized void removeUser(String u) {
            users.remove(u);
        }
    
        public synchronized void removeQuery(String q) {
            queries.remove(q);
        }
    }
    改为
    public class ServerStatusAfterSplit {
        @GuardedBy("users") public final Set<String> users;
        @GuardedBy("queries") public final Set<String> queries;
    
        public ServerStatusAfterSplit() {
            users = new HashSet<String>();
            queries = new HashSet<String>();
        }
    
        public void addUser(String u) {
            synchronized (users) {
                users.add(u);
            }
        }
    
        public void addQuery(String q) {
            synchronized (queries) {
                queries.add(q);
            }
        }
    
        public void removeUser(String u) {
            synchronized (users) {
                users.remove(u);
            }
        }
    
        public void removeQuery(String q) {
            synchronized (users) {
                queries.remove(q);
            }
        }
    }
    
    • 锁分段
      ConcurrentHashMap
    public class StripedMap {
        // Synchronization policy: buckets[n] guarded by locks[n%N_LOCKS]
        private static final int N_LOCKS = 16;
        private final Node[] buckets;
        private final Object[] locks;
    
        private static class Node {
            Node next;
            Object key;
            Object value;
        }
    
        public StripedMap(int numBuckets) {
            buckets = new Node[numBuckets];
            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);
        }
    
        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;
                }
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:减少锁的竞争

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