美文网首页
减少锁的竞争

减少锁的竞争

作者: 史小猿 | 来源:发表于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;
            }
        }
    }
}

相关文章

  • 减少锁的竞争

    缩小锁的范围 缩小锁的粒度 锁分段ConcurrentHashMap

  • java 并发 笔记

    Executor 执行策略: 减少锁竞争: 快进快出 减少锁粒度 锁分段 热点区域lock free

  • 深入理解JAVA 虚拟机 (四)java 线程 ,线程安全 ,

    轻量级锁如果轻量级锁失败,表示存在竞争,升级为重量级锁(常规锁)在没有锁竞争的前提下,减少传统锁使用OS互斥量产生...

  • 八:ReadWriteLock 读写锁

    ReadWriteLock 是读写分离锁, 使用读写分离锁可以有效的帮助减少锁竞争.因为读操作完全不需要对代码块加...

  • ReadWriteLock和CountDownLatch

    ReadWriteLock读写锁 读写分离锁可以有效帮助减少锁竞争以提高系统性能。比如线程A1、A2、A3进行写操...

  • Java 提高锁性能的5点建议

    减少锁持有的时间 对于使用锁来进行并发控制的程序而言,线程对锁的持有时间越长,必能会导致锁竞争变的越激烈。可以想象...

  • 偏向锁,轻量级锁

    1.偏向锁:引入偏向锁是为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路径,因为轻量级锁的获取及释放依赖多...

  • 有助于提高锁性能的几点建议

    1.减少锁持有的时间 对于使用锁进行并发控制的应用程序而言,在锁的竞争过程中,单个线程对锁的持有时间与系统性能有着...

  • java并发编程艺术读书笔记

    1.减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程。 无所并发编程:多线程竞争锁时,会引起...

  • tcmalloc 比较glibc

    使用了thread cache,小块的内存分配都可以从cache中分配。多线程分配内存的情况下,可以减少锁竞争。 ...

网友评论

      本文标题:减少锁的竞争

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