• 자바의 Thread의 실행순서는 JVM이 결정하는것이 아니라 OS의 Thread 스케쥴러에 의해 결정된다.
  • OS에 의존적인 JVM의 몇가지 사항중 하나다.
  • 쓰레드는 자신만의 Call Stack을 가짐으로써 쓰레드간 독립적인 작업을 수행할 수 있게 된다.
  • start() 함수가 새로운 Call Stack을 생성하는 명령어다. run() 메소드를 직접 호출해선 안된다.
  • Thread에는 사용자 쓰레드와 데몬 쓰레드가 있다. 데몬 쓰레드는 사용자 쓰레드가 수행할 작업을 보조하는 역할을 한다.
  • 프로그램은 사용자 쓰레드가 하나도 없을때 종료된다.
  • sleep 함수는 쓰레드를 sleep 시킬 수 있으며, static 메소드기 때문에 자신에게만 적용된다. A 쓰레드가 B쓰레드를 sleep 시킬수 없다.
  • 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하게 막기위해 동기화 작업을 수행해야한다.
  • 공유되어선 안되는 코드를 묶어서 “임계 영역"으로 설정해야한다.
  • 임계영역은 락(lock)을 얻은 단 하나의 쓰레드만 출입이 가능하다. ( 객체1개에 락이 1개만 존재한다. 메소드가 아닌것에 주의! . 출금과 관련된 예제를 떠올려보자.)
  • 임계영역에는 한개의 쓰레드만 들어갈 수 있기때문에 속도측면의 문제점를 줄이기 위해선 임계영역을 최소화해야한다.
  • wait()과 notify()는 동기화 블럭내에서만 사용할 수 있다.
  • wait()을 만나면 객체에 대한 lock을 풀고 해당위치에서 대기상태가 된다.
  • lock을 가진 Thread는 작업을 완료하고 notify()수행하면 자신의 lock을 wating pool에 있는 쓰레드중 하나에게 전달한다.
  • notifyAll()은 wating pool에 있는 모든 Thread를 꺼낸다.