>  기사  >  Java  >  Java 동시 프로그래밍(4) 성능 및 확장성

Java 동시 프로그래밍(4) 성능 및 확장성

巴扎黑
巴扎黑원래의
2017-06-26 09:14:181460검색

성능 및 확장성

1. 문제와 리소스의 관계

   일부 문제에서는 리소스가 많을수록 해결 속도가 빨라집니다.

참고: 모든 프로그램에는 직렬 부분이 있어야 하며, 합리적인 분석에 따르면 직렬 및 병렬 부분이 프로그램에 큰 영향을 미치는 것으로 나타났습니다. 직렬 부분의 비율과 멀티 코어 실행 효율성 사이에는 기하급수적인 관계가 있습니다. 2.ConcurrentLinkedQueue

 멀티 코어 환경에서 이 스레드 안전 대기열은 동기화 목록에 의해 생성된 대기열보다 훨씬 빠릅니다

동시에 제공되는 클래스는 메서드에 의해 생성된 스레드 안전 클래스보다 빠르다고 말할 수 있습니다

2. 스레드 오버헤드

멀티스레딩에는 오버헤드가 있으므로: 따라서 멀티스레딩을 사용하면 성능 향상을 보장해야 합니다 > 동시성 오버헤드

컨텍스트 전환의 오버헤드

메모리 동기화의 오버헤드

3. 잠금 경쟁 감소

1 잠금 보유 시간 줄이기: 잠금 범위 줄이기

private final Map<String, String> attributes = new HashMap<String, String>();//整个方法上锁public synchronized boolean userLocationMatches(String name, String regexp) {
        String key = "users." + name + ".location";
        String location = attributes.get(key);if (location == null)return false;elsereturn Pattern.matches(regexp, location);
    }public boolean userLocationMatches(String name, String regexp) {
        String key = "users." + name + ".location";
        String location;//只针对可变状态上锁synchronized (this) {
            location = attributes.get(key);
        }if (location == null)return false;elsereturn Pattern.matches(regexp, location);
    }

  2. 잠금 요청 빈도 줄이기: 잠금 분해, 잠금 분할...

  잠금 분해: 잠금을 다음과 같은 여러 잠금으로 분해합니다. 여러 상태 변수를 업데이트할 때 각 상태 변수는 동일한 클래스 잠금을 사용할 필요가 없습니다. 관련 없는 각 상태 변수는 자체 잠금 분할을 사용할 수 있습니다. 이러한 방식으로 get과 같은 특정 작업을 수행할 때 동시성 효율성을 높이기 위해 다른 잠금을 유지할 수 있습니다. 물론 일부 작업에서는 잠금과 같은 모든 세그먼트를 동시에 유지해야 합니다.

public class ServerStatusBeforeSplit {public final Set<String> users;public final Set<String> queries;public ServerStatusBeforeSplit() {
        users = new HashSet<String>();
        queries = new HashSet<String>();
    }//每个方法使用 当前class实例锁,类似于synchronized(this),不管是否是操作同一共享状态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 {public final Set<String> users;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);
        }
    }
}

3. 핫스팟 피하기

핫 리소스에 대한 잠금 경쟁이 치열하여 성능 문제가 발생함

4. 독점 잠금 교체

예: 읽기-쓰기 잠금: 읽기-읽기 가능 병렬성 사용, 동시 컨테이너 사용, 불변 객체 사용 등

 5. 컨텍스트 전환 감소

 작업은 차단 상태와 비차단 상태 사이를 전환합니다. 컨텍스트 전환

  예: 로그, 로그 인쇄 및 IO 작업으로 인해 많은 차단 및 해제가 발생하여 성능 문제가 발생합니다

위 내용은 Java 동시 프로그래밍(4) 성능 및 확장성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:자바 9 시작하기다음 기사:자바 9 시작하기