스 레 드 가 안전 하고 스 레 드 가 안전 하지 않 은 것 이 무엇 입 니까?

데이터 구 조 를 보고 있었어 요.    항상 '스 레 드 가 안전 하거나 스 레 드 가 안전 하지 않 은 단어' 가 있 었 는데 그 전에 잘 이해 하지 못 했 습 니 다.
오늘 여기 서 매듭 을 짓 겠 습 니 다.
            ,       ,               ,    ,                  ,        。               。
           

개념:
코드 가 있 는 프로 세 스 에 여러 개의 스 레 드 가 동시에 실행 되 고 있 으 면 이 스 레 드 는 이 코드 를 동시에 실행 할 수 있 습 니 다.매번 실행 결과 가 단일 스 레 드 가 실 행 된 결과 와 같 고 다른 변수의 값 도 예상 한 것 과 같 으 면 스 레 드 가 안전 합 니 다.
또는 하나의 클래스 나 프로그램 이 제공 하 는 인 터 페 이 스 는 스 레 드 에 있어 원자 조작 이나 여러 스 레 드 간 의 전환 으로 인해 이 인터페이스의 실행 결과 에 이의 성 이 존재 하지 않 습 니 다. 즉, 우 리 는 동기 화 문 제 를 고려 하지 않 아 도 됩 니 다.
스 레 드 안전 문 제 는 모두 전역 변수 와 정적 변수 로 인해 발생 한다.
모든 스 레 드 에서 전체 변수, 정적 변 수 는 읽 기 동작 만 있 고 쓰기 동작 이 없 으 면 일반적으로 이 전체 변 수 는 스 레 드 가 안전 합 니 다.여러 개의 스 레 드 가 동시에 쓰기 작업 을 수행 하려 면 스 레 드 동기 화 를 고려 해 야 합 니 다. 그렇지 않 으 면 스 레 드 안전 에 영향 을 줄 수 있 습 니 다.
안전성:
예 를 들 어 하나의 Array List 류 는 하나의 요 소 를 추가 할 때 두 단계 로 완 성 될 수 있 습 니 다. 1. Items [Size] 의 위치 에 이 요 소 를 저장 합 니 다.2. Size 의 값 을 늘린다.
단일 스 레 드 가 실 행 된 경우 Size = 0 이면 하나의 요 소 를 추가 한 후 이 요 소 는 위치 0 이 고 Size = 1 입 니 다.
만약 에 다 중 스 레 드 상황 에서 예 를 들 어 두 개의 스 레 드 가 있 으 면 스 레 드 A 는 먼저 요 소 를 위치 0 에 저장 합 니 다.그러나 이때 CPU 스케줄 러 A 가 일시 정지 되 고 스 레 드 B 가 실 행 될 기 회 를 얻 습 니 다.스 레 드 B 도 이 ArrayList 에 요 소 를 추가 합 니 다. 이때 Size 는 0 과 같 기 때 문 입 니 다. (주의 하 세 요. 우 리 는 하나의 요 소 를 추가 하 는 것 은 두 단계 가 필요 하 다 고 가정 합 니 다. 스 레 드 A 는 절차 1 만 완 료 했 기 때문에 스 레 드 B 도 요 소 를 위치 0 에 저장 합 니 다.그 다음 에 스 레 드 A 와 스 레 드 B 가 계속 실행 되 고 모두 Size 의 값 을 증가 합 니 다.
좋 습 니 다. Array List 의 상황 을 살 펴 보 겠 습 니 다. 요 소 는 실제로 하나 밖 에 없 는데 위치 0 에 저장 되 어 있 지만 Size 는 2 와 같 습 니 다.이것 이 바로 '라인 이 안전 하지 않다' 는 것 이다.

좋은 웹페이지 즐겨찾기