java - i++에 대한 질문
phpcn_u1582
phpcn_u1582 2017-05-17 10:00:27
0
2
609

2개의 스레드를 사용하여 i=1을 자동 증가시키고 각 스레드는 이를 100번 실행합니다. 가능한 최대값과 최소값은 얼마입니까? 설명해주세요

또한 물어보세요. ++i는 원자인가요?

phpcn_u1582
phpcn_u1582

모든 응답(2)
洪涛

최소값은 3(+2), 최대값은 201(+200)이 될 수 있습니다. . . . 왜 0부터 시작하지 않는 걸까요? . .

주기 프로세스는 다음과 같습니다.

  1. 메모리에서 데이터를 읽어 등록

  2. 등록값++

  3. 데이터를 메모리에 다시 쓰기

다음 세 단계 중 하나에서 스레드가 중단될 수 있습니다. 3의 경우는 다음과 같습니다.
첫 번째 스레드는 1 데이터를 읽은 후 일시 중지되고 레지스터 값은 다른 위치에 저장됩니다. 1,然后被挂起,寄存器的值被保存到另一个地方。
第二个线程,持续执行了 99 次(此时,内存中的值为 100),然后被挂起。
第一个线程被唤醒,恢复寄存器的 1 +1 之后 (=2)被写回内存,该线程被挂起
第二个线程从内存读取2到寄存器之后被挂起
第一个全部执行完,把值写回内存
唤起第二个线程,恢复寄存器中的2,完成最后一次循环+1 之后写回 3

所以最终结果是 3두 번째 스레드는 99번(이때 메모리에 있는 값은 100) 실행을 계속한 후 일시 중단되었습니다.

첫 번째 스레드가 활성화되고 복구 레지스터(=2)의 1 +1이 메모리에 다시 기록된 후 스레드가 일시 중지됩니다.

첫 번째 두 스레드는 메모리에서 레지스터로 2를 읽고 일시 중단됩니다. 첫 번째 스레드는 완전히 실행되고 값을 다시 메모리에 씁니다.

두 번째 스레드를 호출합니다. 레지스터의 값을 복원합니다. 2, 마지막 루프 +1을 완료한 후 3을 다시 씁니다

🎜그래서 최종 결과는 3입니다. . . . 🎜 🎜아직은 더 작은 스케줄링 방법은 생각해본 적이 없어요. . . 🎜 🎜최대값은 너무 많이 설명할 필요가 없습니다. . . . 🎜
Ty80

최소값은 2이고 최대값은 200입니다.
2는 두 스레드가 CPU 캐시의 데이터를 수정하고 결국 메모리가 한 번만 새로 고쳐진다는 의미입니다.
200은 두 스레드가 서로 경쟁하지 않고 교대로 읽고 수정한다는 의미입니다.
우리는 모두 최대값과 최소값에 대해 질문했지만 당연히 원자적이지 않습니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿