일부 문제에서는 리소스가 많을수록 해결 속도가 빨라집니다.
참고: 모든 프로그램에는 직렬 부분이 있어야 하며, 합리적인 분석에 따르면 직렬 및 병렬 부분이 프로그램에 큰 영향을 미치는 것으로 나타났습니다. 직렬 부분의 비율과 멀티 코어 실행 효율성 사이에는 기하급수적인 관계가 있습니다. 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); }
잠금 분해: 잠금을 다음과 같은 여러 잠금으로 분해합니다. 여러 상태 변수를 업데이트할 때 각 상태 변수는 동일한 클래스 잠금을 사용할 필요가 없습니다. 관련 없는 각 상태 변수는 자체 잠금 분할을 사용할 수 있습니다. 이러한 방식으로 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. 컨텍스트 전환 감소
작업은 차단 상태와 비차단 상태 사이를 전환합니다. 컨텍스트 전환
위 내용은 Java 동시 프로그래밍(4) 성능 및 확장성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!