Vector, Stack 소스 분석
7065 단어 원본 코드
Vector
Vector는 AbstractList를 계승하여List,RandowAccess,Cloneable,Serializable 인터페이스를 실현하였으며,ArrayList가 다중 라인에서 대체할 수 있는 선택이다.Vector 대부분의 방법은 Array List와 같고 동기화가 필요한 방법은 모두
synchronized
키워드를 사용하여 수식하고 모든 것이 동기화된다. /** vector
*/
public Enumeration elements() {
return new Enumeration() {
int count = 0;
public boolean hasMoreElements() {
return count < elementCount;
}
public E nextElement() {
synchronized (Vector.this) {
if (count < elementCount) {
return elementData(count++);
}
}
throw new NoSuchElementException("Vector Enumeration");
}
};
}
Vector와 ArrayList의 차이점
Vector
ArrayList
동기식, 스레드 보안
비동기식, 불안정한 스레드
동기화 잠금 유지가 필요한 오버헤드 및 낮은 성능
높은 성능
Iterator, foreach, Enumration 교체 사용 가능
Iterator, foreach 교체 사용 가능
용량 2배 증가
1.5배 증가
라인 안전이 필수적이지 않은 상황에서 Array List,vector를 사용하여
get
등 속성을 얻는 방법에synchronized 키워드를 추가하여 수식하기 때문에 성능에 큰 영향을 미칠 수 있습니다Stack
스택은 Vector 기반 스택의 구현 Stack을 제공하는 JAVA API의 고급 데이터 구조입니다.
public class Stack<E> extends Vector<E>
Stack은 Vector에서 계승된 것으로 모든 본질도 수조로 이루어지고 라인이 안전하다. 다음은 Stack이 실현하는 독특한 몇 가지 방법을 살펴보자.
/** ,push , addElement Synchronized
*/
public E push(E item) {
addElement(item);
return item;
}
/**
*/
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
/**
* ( )
*/
public synchronized E peek() {
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
/**
* Tests if this stack is empty.
*/
public boolean empty() {
return size() == 0;
}
/**
* , ( ) 1, -1
*/
public synchronized int search(Object o) {
int i = lastIndexOf(o);
if (i >= 0) {
return size() - i;
}
return -1;
}
총결산
Array List, Vector와 Stack은 모두 수조를 바탕으로 이루어진 것이기 때문에 검색 복잡도가 비교적 낮고 삽입 복잡도가 비교적 높다. 전자는 라인이 안전하지 않고 후자는 라인이 안전하기 때문에 개발 과정에서 Array List를 우선적으로 사용한다.
Synchronized
Synchronized는 자바에서 문제를 해결하고 발송하는 데 가장 자주 사용하는 방법이자 가장 간단한 방법이다.Synchronized의 역할은 주로 세 가지가 있다. (1) 라인이 서로 밀접하게 연결되는 접근 동기화 코드 확보(2) 공유 변수의 수정이 제때에 볼 수 있도록(3) 정렬 문제를 효과적으로 해결할 수 있도록 한다.문법적으로 말하자면 Synchronized는 모두 세 가지 용법이 있다.수식 일반 방법 2.정태 수식 방법 3.코스메틱 코드 블록
코스메틱 일반 방법(객체 동기화)
다중 스레드에서 같은 대상이 일반 방법을 동시에 호출할 때, 호출된 스레드는 먼저 호출된 스레드가 실행되고 자물쇠가 풀린 후에야 실행할 수 있습니다.대상 차원에서 자물쇠를 채우기 때문에 서로 다른 대상은 일반적인 방법을 동시에 호출할 수 있다(사실 방법 자체는 독립적이며 다선정의 영향을 받지 않는다)
코스메틱 정적 방법(클래스 동기화)
정적 방법에 대한 동기화는 본질적으로 클래스에 대한 동기화(정적 방법은 본질적으로 클래스에 속하는 방법이지 대상에 속하는 방법이 아니다)이기 때문에 같은 클래스에 속하는 서로 다른 실례 대상이 같은 방법에 대한 호출에도 순서대로만 실행할 수 있고 동시에 실행할 수 없다.
코스메틱 코드 블록
코드 블록의 수식은 세 가지 형식으로 나뉘는데 앞의 두 가지는 대상 자물쇠를 받아야 하고 마지막 하나는 클래스 자물쇠를 받아야 한다.
어떤 형태의 자물쇠든 동기화 방법(또는 코드 블록을 실행할 때)은 대응하는 대상 자물쇠나 클래스 자물쇠를 먼저 가져와야 하며 대상 자물쇠와 클래스 자물쇠 사이는 독립적이다.
원리 분석
Sychronized 코드 블록 동기화는 JVM에서
monitorenter
및 monitorexit
명령으로 수행됨대상마다 모니터 자물쇠가 있습니다.모니터가 점용될 때 잠금 상태가 됩니다. 라인이 모니터 관리자 명령을 실행할 때 모니터의 소유권을 얻으려고 시도합니다. 과정은 다음과 같습니다.
모니터 xit를 실행하는 라인은 Objectref에 대응하는 모니터의 소유자가어야 합니다.명령이 실행될 때 모니터의 진입수가 1로 줄어듭니다. 1을 줄인 후 진입수가 0이면, 이 라인은 모니터에서 종료됩니다. 더 이상 이 모니터의 소유자가 아닙니다.이 모니터에 의해 막힌 다른 라인은 이 모니터의 소유권을 얻으려고 시도할 수 있습니다.
이 두 단락의 묘사를 통해 우리는 Synchronized의 실현 원리를 분명히 알 수 있다. Synchronized의 의미 밑바닥은 하나의 모니터의 대상을 통해 완성된다. 사실wait/notify 등 방법도 모니터의 대상에 의존한다. 이것이 바로 동기화된 블록이나 자 방법에서만 wait/notify 등 방법을 사용할 수 있고 그렇지 않으면java를 던질 수 있는 이유이다.lang.Illegal Monitor State Exception의 이상한 원인.
방법의 동기화는 지령 모니터와 모니터 exit를 통해 이루어지지 않는다(이론적으로 이 두 지령을 통해서도 실현할 수 있다). 그러나 일반적인 방법에 비해 상량 탱크에는 ACC 가 많다.SYNCHRONIZED 표시자JVM은 이 표시자에 따라 방법의 동기화를 실현한다. 방법이 호출될 때 호출 명령은 방법의 ACC 를 검사한다SYNCHRONIZED 액세스 로고가 설정되었는지 여부입니다. 설정되면 실행 루틴은 모니터를 먼저 가져오고, 성공한 후에야 방법체를 실행할 수 있으며, 방법이 실행된 후에 모니터를 풀 수 있습니다.방법이 실행되는 동안 다른 어떤 라인도 같은 모니터 대상을 얻을 수 없습니다.사실 본질적으로 차이가 없다. 단지 방법의 동기화는 일종의 은밀한 방식으로 실현되고 바이트 코드를 통해 완성할 필요가 없다.
Synchronized 참조
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Asp와 XML로 상호작용하는 실례 원본XML은 표준 확장 언어로 미래 웹 프로그래밍의 표준이다. asp는 현재 널리 전해지는 웹 프로그래밍 언어 중의 하나이다. 그들 두 사람이 연합하여 역할을 발휘할 수 있을까?두부는 여기서 여러분에게 아주 간단한 As...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.