작성
·
73
0
안녕하세요. 영한님 궁금한 점이 있습니다.
sleep(10) 를 하면 동시 실행을 더 촉진할 수 있다는 것이 이해가 안됩니다.
예를 들어, 아래를 가정한다면요! 각 시간은 별도로 가정한 것입니다.
1번 쓰레드가 1.0초에 먼저 실행이 된 후 0.1 초 쉬었다가 실행이 되면 1.1초에 실행 가정,
2번 쓰레드가 1.1초에 먼저 실행이 된 후 0.1 초 쉬었다가 실행이 되면 1.2초에 실행 가정,
3번 쓰레드가 1.2초에 먼저 실행이 된 후 0.1 초 쉬었다가 실행이 되면 1.3초에 실행 가정,
...
그렇다면 각 쓰레드가 0.1초씩 쉬었다고 하더라도 결국에는 실행시점이
1.1초, 1.2초, 1.3초 다 다르다고 봐도 되지 않나요?
뭔가, sleep(10) 을 빠지게 되면 대부분 쓰레들이 비슷한 시점에 10ms 를 자고, 거의 동시에 깨어나서 increment() 를 실행하는 것 같은데 맞나요?
맞다면 왜 그런가요?
감사합니다!
답변 2
0
안녕하세요. highjune님
JVM, OS에서 스레드를 재우고 깨우는 방식에서 완전히 정확하게 깨어나지는 않습니다.
특정 주기로 스레드들을 깨우는데, 그 주기의 시간이 지난 스레드를 깨우는 것입니다. 물론 아주 짧은 순간이겠지요?
예를 들어서 0.01ms와 0.02ms 차이로 잠이 들면 깨우는 시간은 비슷하게 깨어날 수 있습니다.
그래서 동시 실행을 촉진할 수 있게 됩니다.
하지만 이것은 항상 그런것은 아니고 환경에 따라 달라질 수 있습니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. highjune님.
스레드 프로그래밍에서 Thread.sleep(10)
과 같은 짧은 sleep은 스레드의 동작을 조정하는 데 사용됩니다. 이 방법은 매우 짧은 시간 단위로 멀티스레딩을 조정하여 컨텍스트 스위칭을 발생시키고 더욱 균일하게 CPU 자원을 분배하는 데 기여할 수 있습니다.
동시 실행 촉진: Thread.sleep(10)
을 사용하면 특정 스레드가 CPU를 독점하는 것을 방지하고, 각 스레드가 잠깐씩 멈춰 다른 스레드가 CPU를 사용할 기회를 주므로 동시 실행이 촉진될 수 있습니다.
컨텍스트 스위칭: 여러 스레드가 서로 다른 작업을 동시에 수행할 때, 짧은 sleep을 통해 컨텍스트 스위칭이 발생하게 됩니다. 이는 각 스레드가 공정하게 CPU 시간을 사용하게 허용하며, 비슷한 시점에 깨어나 작업을 수행하게 할 수 있습니다.
작업 동기화: 여러 스레드가 increment()
와 같은 공유 자원에 접근할 때 동기화를 해야 합니다. sleep을 사용함으로써 컨트롤된 방식으로 동기화와 리소스 경쟁을 관리할 수 있습니다.
관련 내용에 대한 더 많은 정보는 아래 링크를 참고하시면 좋습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.