이전 포스팅에서 쓰레드의 메모리 구성에 대해 알아봤다.실제 쓰레드 프로그래밍에서는 하나의 인스턴스에 둘 이상의쓰레드가 접근하는 형태의 구현을 많이 볼수 있다. 하지만이러한 경우에 동기화를 해주지 않으면 문제가 발생한다.우선 어떤 문제가 발생되는지 알아보자. 예를 들어 변수A에 100이 저장 되어있고,저장된 값을 1씩 증가시키는 연산을두 개의 쓰레드가 한다고 하자. 이 상황에서 쓰레드1이 변수 A에 저장된 값을101로증가시켜놓은 다음 쓰레드2가 변수 A에 접근을하면예상되듯 변수 A에는 101이 저장된다. 그런데 여기서 중요한것은 값의 증가 방식이다.값의 증가는 CPU를 통해 연산이 필요한 작업이므로그냥 변수A에 저장된 값이 변수 A에 저장된 상태로 증가하지 않는다.이 변수 A에 저장된 값은 쓰레드1에 의해..
이번엔 쓰레드의 메모리구성에 대해 알아보자.쓰레드 생성 포스팅에서 쓰레드가 생성되면 가상머신은쓰레드의 실행을 위한 별도의 메모리 공간을 할당한다고 했다.그렇다면 이러한 별도의 메모리공간은정확히 무엇을 의미하는걸까?쓰레드의 가장 큰 역할은 별도의 실행흐름 형성이다. 그리고 별도의 실행흐름은 메소드의 호출을 통해서 형성된다.즉 처음에 run메소드가 호출되고 run메소드 내에서 또다른 메소드를호출하면서 main메소드와는 다른 흐름을 형성한다.이렇듯 main 메소드와는 전혀 다른 실행흐름을 형성하기 위해서는별도의 스택이 쓰레드에게 할당되어야 한다.따라서 main 쓰레드 이외에 두 개의 쓰레드가 추가로 생성되면가상 머신은 아래의 형태로 메모리를 구성한다. 위 그림에서 처럼 모든 쓰레드는 자신의 스택을 할당 받는다..
이전 포스팅까지 쓰레드의 생성방법과 우선순위 컨트롤에 대해 알아보았다.이번엔 쓰레드의 라이프 싸이클이다.먼저 쓰레드가 처리되는 방식을 전체적으로 정리해보자. 쓰레드가 생성되면 위 그림이 처럼 네 가지 상태 중한 가지 상태에 있게된다. 각각의 상태에 놓이는 시점과상태가 변경되는 시점을 정리하면 아래와 같다. New상태 쓰레드 클래스가 키워드 new를 통해서인스턴스화 된 상태를 가리켜 New상태 라한다.이상태에서는 자바 가상머신에 의해 관리가 되는쓰레드의 상태는 아니다. 운영체제에 입장에서는쓰레드라 부르기에는 이른감이 있다. 그러나 자바에서는이 상태에서부터 쓰레드라 표현한다. Runnable상태쓰레드 인스턴스를 대상으로 start 메소드가 호출되면 해당 쓰레드는 그때부터 Runnable상태가 된다.이는 모든..
이전 포스팅에서 쓰레드의 생성하는 방법에대해 알아보았다. 이번엔 쓰레드의 특성에 관해 알아보자.쓰레드를 생성할때는 여러개의 쓰레드를 생성할 수 있다. 둘 이상의 쓰레드가 생성될 수 있기때문에 자바 가상머신(자바 가상머신의 일부로 존재하는 쓰레드 스케줄러)은 쓰레드의실행을 스케줄링 해야한다. 스케줄링에 사용되는 알고리즘의기본원칙은 아래와 같다. 1.우선순위가 높은 쓰레드의 실행을 우선한다.2.동일한 우선순위의 쓰레드가 둘 이상 존재할때는 CPU의할당시간을 분배해서 실행한다. 자바의 쓰레드에는 우선순위 라는것이 할당된다.이것은 가상머신에 의해서 우선적으로 실행되어야 하는쓰레드의 순위를 의미하는 것으로 가장 높은 우선 순위는 정수10으로가장 낮은 순위는 정수1로 표현한다. 즉 총10단계의우선순위가 존재하는 것..
쓰레드 클래스의 정의를 위해서는 Thread 클래스를 상속해야만 한다. 때문에 쓰레드 클래스가 상속해야 할 또 다른 클래스가 존재한다면,이는 문제가 아닐 수 없다. 따라서 자바는 쓰레드를 생성하는 방법으로인터페이스의 구현을 통한 방법을 제시한다.인터페이스를 통한 다중상속의 효과에 해당하는 예로도 볼수 있다.복잡한 방법은 아니니 아래의 소스를 통해 보자. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748class Sum{ int num; public Sum() { num = 0; } public void addNum(int n) { num+=n; } public int getNum() { return..
쓰레드 관련 프로그래밍 자체는 그리 어렵지 않다.하지만 쓰레드에 대한 이해 없이는 프로그래밍이 불가능 하다.따라서 쓰레드에 대해 먼저 알아보자 프로그램의 실행 주체는 운영체제이다.프로그램의 실행이 요청되어지면아래와 같은 형태로 메모리 공간이 할당된다. 이 메모리를 기반으로 프로그램이 실행된다. 이렇듯 할당된 메모리 공간을 기반으로실행 중에 있는 프로그램을 가리켜 '프로세스' 라 한다.따라서 프로세스를 간단히 실행중인 프로그램 으로설명하기도 한다. 하지만 지금까지 우리가 보아왔던프로세스들은 프로그램의 흐름을 하나만 형성하고 있다.main 메소드의 호출을 통해서 하나의 흐름이 형성되며main메소드의 실행이 완료되면 흐름도 종료가 됬다. 그러나 하나의 프로세스 내에서 둘 이상의 프로그램 흐름을형성할 수도 있다..
String 은 변경이 불가능한 문자열의 표현을 위한Class 이지만, StringBuilder와 String Buffer는 변경이가능한 문자열의 표현을 위한 Class 들이다.단 String 인스턴스와 달리 StringBuilder 와 StringBuffer의인트턴스를 가리켜 문자열이라 하지는 않는다 -StringBuilderStringBuilder는 문자열의 저장 및 변경을 위한메모리 공간(버퍼)을 내부에 지니는데,이 메모리 공간은 크기가 자동으로조절 된다는 특징이 있다. 그리고 이 클래스에서가장 중요하게 여겨지는 메소드는 append와 insert인데아래의 소스로 기능을 소개하겠다. 1234567891011121314class test{ public static void main(String[] a..