[CS][Java] String/Object class, Thread

윤경·2021년 12월 30일
0

CS

목록 보기
2/6


String class

String 특징

  • new 연산을 통해 생성된 인스턴스의 메모리 공간은 변하지 않음
    ➡️ Immutable
  • Garbage Collector로 제거되어야 함
  • 문자열 연산시 새로 객체를 만드는 Overhead 발생
  • 객체가 불변하므로 MultiThread에서 동기화를 신경쓰지 않아도 됨
    ➡️ 조회 연산에서 큰 장점

➡️ String Class는 문자열 연산이 적고, 조회가 많은 멀티쓰레드 환경에 유리

StringBuffer, StringBuilder 특징

공통점

  • new 연산으로 클래스 한 번만 생성
    ➡️ Mutable
  • 문자열 연산시 새로 객체를 만들지 않고, 크기를 변경
  • StringBufferStringBuilder 클래스의 메소드가 동일

차이점

  • StringBufferThread-safe 함
  • StringBuilderThread-safe 하지 않음

➡️ StringBuffer 클래스는 문자열 연산이 많은 Multi-Thread 환경,
StringBuilder 클래스는 문자열 연산이 많은 Single-Thread 또는 Thread를 신경쓰지 않는 환경에 유리


Object Class

: 자바 최상위 클래스

Object Class가 가진 메소드

  • toString()
  • hashCode()
  • wait()
    : 갖고 있던 고유 lock 해제, Thread를 잠들게 함
  • notify()
    : 잠들던 Thread 중 임의의 하나를 깨움
  • notifyAll()
    : 잠들어 있던 Thread를 모두 깨움

➡️ wait(), notify(), notifyAll()은 호출하는 thread가 반드시 (📌)고유 락 을 가지고 있어야 함

📌 고유락: 자바의 모든 객체는 lock을 가짐

  • Synchronized 블록 내에서 실행되어야 함
  • 그 블록 안에서 호출되지 않는 경우 IllegalMonitorStateException 발생
    (고유락을 획득하지 않은 상태에서 위 메소드들 중 하나를 호출하면 발생하는 에러)

Thread

: 하나의 작업 단위

멀티 태스킹: 두 가지 이상의 작업을 동시 수행
실제 동시 처리가 가능한 프로세스의 개수 = CPU 코어 개수

Thread 구현

자바의 thread 구현 방법 두 가지

  1. Runnable 인터페이스 구현
  2. Thread 클래스 상속

➡️ 둘 다 run() 메소드를 오버라이딩 하는 방식.
생성 방법의 차이임

  1. Runnable 인터페이스 구현의 경우 해당 클래스를 인스턴스화해 Thread 생성자에 인자로 넘겨야 함.
    그리고 run()을 호출하면 Runnable 인터페이스에서 구현한 run()이 호출되므로 따로 오버라이딩이 필요 없음 ➡️ 장점
  1. Thread 클래스 상속의 경우, 상속받은 클래스 자체를 thread로 사용 가능

⚠️ Thread 실행은 run()이 아닌 start()

run()은 thread를 사용하는 것이 아니다.

Thread를 사용하다 = JVM이 다수의 콜 스택을 번갈아 일처리하고 사용자에게 동시에 작업하는 것처럼 보여주는 것

run() 메소드는 main()의 콜 스택 하나만 이용하는 것이다. (Thread를 사용하는 것이 아님)
➡️ 단지 Thread 각체의 run()이라는 메소드를 호출하게 되는 것 뿐임

반면, start()는 JVM이 알아서 Thread를 위한 콜 스택을 새로 만들어주고, context switching을 통해 thread답게 동작하도록 해준다.
➡️ Thread가 작업하는데 필요한 콜 스택을 생성한 다음, run()을 호출해 그 스택 안에 run()을 저장하도록 해줌

Thread의 실행 제어(상태 5가지)

  • NEW
    : thread 생성, 아직 start() 호출 전
  • RUNNABLE
    : 실행 중 또는 실행 가능 상태
  • BLOCKED
    : 동기화 블럭에 의해 일시정지 된 상태(lock이 풀릴 때까지 기다림)
  • WAITING, TIME_WAITING
    : 실행 가능하지 않은 일시정지 상태
  • TERMINATED
    : thread 작업이 종료된 상태

profile
개발 바보 이사 중

0개의 댓글