美文网首页
Java 提高锁性能的5点建议

Java 提高锁性能的5点建议

作者: 贼噶人 | 来源:发表于2021-01-22 16:41 被阅读0次

减少锁持有的时间

对于使用锁来进行并发控制的程序而言,线程对锁的持有时间越长,必能会导致锁竞争变的越激烈。
可以想象下我们排队买包子,买包子的窗口只有那么几个,如果轮到我们了我们才去想要买什么包子,势必会影响整个队伍的效率,所以我们应该在之前就想好自己要买什么包子。

public synchronized void syncFunc(){
      func1();
      mutexFunc();
      func2();
}

如果以上代码的func1和func2都是比较耗时的方法,但是他不需要同步,只有中间的方法需要同步,如果我们这么写势必会造成整个方法持有锁的时间,时间长了会导致竞争概率的提高,白白浪费系统资源,影响程序性能,所以只对有需要的方法加lock。

public void syncFunc(){
      func1();
      synchronized(lock) {
          mutexFunc();
      }  
      func2();
}

较少锁的粒度

ConcurrentHashMap就是一个很好的例子,比如其put方法发生Hash冲突时他只是对该Node进行加锁操作。

读写分离

读操作不会影响数据的属性和结构,所以我们对于读-读线程间就不需要同步,来减少锁的竞争。

锁分离

LinkedBlockingQueue 就是一个很好的例子,我们知道其是链表实现的,主要的操作有take和put,并且其分别在head和tail进行操作,之间是没有影响的,所以其使用两把锁分别来控制其take和put操作。

 public E take() throws InterruptedException {
        E x;
        int c = -1;
        final AtomicInteger count = this.count;
        final ReentrantLock takeLock = this.takeLock;
        takeLock.lockInterruptibly();
        try {
            while (count.get() == 0) {
                notEmpty.await();
            }
            x = dequeue();
            c = count.getAndDecrement();
            if (c > 1)
                notEmpty.signal();
        } finally {
            takeLock.unlock();
        }
        if (c == capacity)
            signalNotFull();
        return x;
    }
public void put(E e) throws InterruptedException {
        if (e == null) throw new NullPointerException();
        int c = -1;
        Node<E> node = new Node<E>(e);
        final ReentrantLock putLock = this.putLock;
        final AtomicInteger count = this.count;
        putLock.lockInterruptibly();
        try 
            while (count.get() == capacity) {
                notFull.await();
            }
            enqueue(node);
            c = count.getAndIncrement();
            if (c + 1 < capacity)
                notFull.signal();
        } finally {
            putLock.unlock();
        }
        if (c == 0)
            signalNotEmpty();
    }

粗化锁

for () {
  synchronized(lock) { // 本身锁的申请和释放都是有代价的,所以我们要进行粗化
      //code    
  }
}
synchronized(lock) {
for () {
   // 本身锁的申请和释放都是有代价的,所以我们要进行粗化
      //code 
    }
  }

相关文章

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

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

  • 第四章 锁的优化

    1. 提高锁性能的几点建议 1.1 减小锁持有时间 1.2 减小锁粒度 例如ConcurrentHashMap,将...

  • 第4章 锁的优化及注意事项

    提高锁性能的几点建议减小锁持有时间减小锁粒度读写分离锁替换独占锁(读多写少的场景)锁分离(LinkedBlocki...

  • 锁的优化及注意事项(一)

    一、提高锁性能的几点建议 锁的竞争会导致程序整体性能的下降,如何降低锁竞争带来的副作用是我们必须考虑的。下面提出几...

  • Java多线程--锁的优化

    Java多线程--锁的优化 提高锁的性能 减少锁的持有时间 一个线程如果持有锁太长时间,其他线程就必须等待相应的时...

  • 《实战高并发程序设计》读书笔记-锁优化的角度

    锁的优化及注意事项 有助于提高”锁“性能的几点建议 减小锁持有时间 应该尽可能地减少对某个锁的占有时间,以减少线程...

  • java 内存模型 锁的理解

    java 内存模型 锁的理解 Java 1.6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”...

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

    “锁”的竞争必然会导致程序的整体性能下降。以下建议是为了将这种副作用降到最低。 减小锁持有时间只有在必要的时候进行...

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

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

  • Java8原子类的增强

    无锁的原子类操作使用系统的CAS指令,Java8中引入了LongAdder类,来进一步提高性能。 AtomicIn...

网友评论

      本文标题:Java 提高锁性能的5点建议

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