Java 컬렉션의 클래스 스레드 보안 정보

Java 컬렉션의 클래스는 스레드가 안전합니다.
스레드 보안 클래스
집합 프레임워크에서 일부 종류는 라인이 안전하다. 이것들은 모두 jdk1.1에서 나온 것이다.jdk1.2 이후 많은 비선정 안전 클래스가 등장했다.다음은 이러한 스레드가 안전하게 동기화되는 클래스입니다.
vector:arraylist보다 동기화 메커니즘(스레드 안전)이 많습니다. 효율이 낮기 때문에 지금은 사용을 권장하지 않습니다.웹 응용 프로그램, 특히 프론트 데스크톱 페이지는 효율(페이지 응답 속도)을 우선적으로 고려한다.
statck: 창고류, 선진 후출
hashtable:hashmap보다 라인이 더 안전합니다.
enumeration: 매개, 교체기에 해당한다
이것들을 제외하고 다른 것은 모두 비선정 안전한 클래스와 인터페이스이다.
스레드 보안의 종류는 동기화됩니다. 매번 한 번만 접근할 수 있습니다.중량급 대상으로 효율이 낮다.
기타:
1.hashtable과hashmap의 차이
hashtable는 라인이 안전하다. 즉hashtable의 방법은 모두 동기화 메커니즘을 제공한다.hashmap은 스레드가 안전한 것이 아니라 동기화 메커니즘을 제공하지 않습니다.hashtable는 빈 값을 삽입할 수 없습니다.hashmap은 허용합니다!
2. 다중 스레드를 병발하여 하나의 집합을 수정하면 어떻게 합니까
오래된 Vector/Hashtable 클래스로
StringBuffer는 스레드가 안전하고, StringBuilder는 스레드가 안전하지 않습니다.안전과 불안에 대한 깊은 이해가 없는 상황에서 이런 착각을 일으키기 쉽다. 만약에 StringBuffer에 대한 조작이 모두 라인이 안전하다면. 그러나 자바가 당신에게 보증한 라인의 안전은 그 방법의 집행이 그 대상 자체에 대한 여러 번의 호출 상황이 아니라 안전하다는 것이다.다음 예시를 보십시오. StringBufferTest에 데이터 구성원 콘텐츠가 있습니다. 이것은 확장하는 데 사용됩니다. 매번의 append는 라인이 안전하지만 여러 번의 append의 조합은 라인이 안전하지 않습니다. 이 출력 결과는 제어할 수 없는 것이지만log와 getContest 방법에 키워드synchronized를 추가하면 결과는 매우 조리 있게 바뀝니다. 만약에 StringBuider, 심지어 append를 절반으로 바꾸면또한 이를 기반으로 하는 다른 스레드도 사용할 수 있습니다.

public class StringBufferTest {
  private StringBuffer contents = new StringBuffer();
  public void log(String message){
   contents.append(System.currentTimeMillis());
   contents.append("; ");
   contents.append(Thread.currentThread().getName());
   for(int i=0;i<10000;i++){
    contents.append(i);  
     contents.append(message);  //append , contents , 。
     contents.append("
"); } contents.append("

"); } public void getContents(){ System.out.println(contents); } } class RunThread extends Thread{ String message; StringBufferTest buffer; public RunThread(StringBufferTest buffer, String message){ this.buffer = buffer; this.message = message; } public void run(){ while(true){ buffer.log(message); buffer.getContents(); } } public static void main(String[] args) { StringBufferTest ss = new StringBufferTest(); new RunThread(ss, "you").start(); new RunThread(ss, "me").start(); new RunThread(ss, "she").start(); } }
StringBuilder와 StringBuffer의 방법은 똑같습니다. 바로 다중 노드와 단일 노드의 문제입니다.라인은 같은 StringBuffer의 append 방법을 호출합니다. 이것은 그가 라인의 안전인지와 관계가 없습니다. 당신의 결과가 append의 일련의 문자열이 혼란스러워져야만 그가 라인이 안전하지 않다는 것을 설명할 수 있습니다.스레드 안전은 언제든지 하나의 스레드가 임계 자원에 접근하는 것을 가리킨다.스레드 안전은 그의 일련의 조작이 동기화되는 것이 아니라 단지 그가 어떤 방법을 실행할 때 다른 스레드를 바꾸는 것을 허락하지 않을 뿐이다.한 종류에 대해 말하자면 라인이 안전한지 아닌지는 보아야 한다. 여러 개의 라인이 동시에 운행하고 있는데, 이런 라인은 어떤 방법을 동시에 실행할 수 있다.그러나 매번 운행 결과는 단일 노드가 실행한 결과와 같다면 노드가 안전하다고 할 수 있다.로그 방법이 자물쇠를 채우지 않았기 때문에, 현재 append 자물쇠가 풀리면 cpu의 실행 세션을 얻을 수 있습니다.
그러나 다중 스레드 안전에 대한 오해는 하지 마십시오.

 public String toString(){
   StringBuffer buffer = new StringBuffer();
   buffer.append('<');
   buffer.append(this.name);
   buffer.append('>');
   return buffer.toString();
  }
이 코드는 완전 스레드가 안전합니다. 방법 내부에서 정의된 변수입니다. 모든 스레드가 들어갈 때 이 부분 변수를 만들 것입니다!스레드 안전 문제는 관련이 없다.일반적으로 시스템 안전과 관련된 변수는 일반적으로 구성원 변수입니다!stringBuffer 자체의 내부 실현은 현장에서 안전하다!라인 안전. 그건 클래스 자체가 제공하는 기능이야. 안전해.즉, 문자열을 삽입하는 것을 제공한다. 그러면 이 문자열 삽입은 안전하지만, 두 개의 문자열을 삽입해야 한다. 두 개의 순서는 네가 정해야 한다. 이 사이에 다른 삽입 오류가 있으면 클래스에 상관없이 네 코드의 문제이다.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기