본문 바로가기
728x90
반응형
SMALL

쓰레드12

쓰레드의 동기화(4) volatile 싱글 코어 프로세서가 장착된 컴퓨터에서는 크게 문제가 없이 실행될 것이다. 그러나 요즘 대부분 멀티코어 프로세서가 장착된 컴퓨터를 사용하기 때문에, 문제가 많아질 수 있다. 왜냐하면 멀티 코어 프로세서에서 코어마다 별도의 캐시를 가지고 있기 때문이다. 코어는 메모리에서 읽어온 값을 캐시에 저장하고 캐시에서 값을 읽어서 작업한다. 다시 같은 값을 읽어올때는 머넞 캐시에 있는지 확인하고 없을 때만 메모리에서 읽어온다. 그러다보니 도중에 메모리에 저장된 변수의 값이 변경되었는데도 캐시에 저장된 값이 갱신되지 않아서 메모리에 저장된 값이 다른 경우가 발생한다. 그래서 변수 stopped의 값이 바뀌었는데도 쓰레드가 멈추지않고 계속 실행된다. 변수에 volatile을 붙이는 대신에 synchron.. 2021. 10. 16.
기아현상/경쟁상태 자바의 정석 쓰레드를 공부를 마치면서 기아현상/ 경쟁상태에 대해 의문점이 들어 한번 스스로 공부해보았다. 기아현상이란? 어떤 쓰레드가 다른 쓰레드들이 CPU시간을 모두 잡고 있어 CPU시간을 사용할 수 없게 되는 현상을 "기아상태(starvation)" 라 한다. 이 기아 쓰레드는 글자 그대로 "굶어 죽게" 된다. 다른 쓰레드들이 CPU시간을 사용하도록 되어 있기 때문이다. 기아상태의 해결책은 "공정성(fairness)" 이다. 공정성이란, 모든 쓰레드들이 자신의 작업을 수행할 기회를 공정하게 갖는 것을 의미한다. 즉, 결코 사용할 수 없는 자원을 무한정 기다리는 상태를 말한다. 내가 배운선에서 해결하는 방법 : notifyAll()또는 지정해서 notify() /signal(), signalALl() .. 2021. 10. 15.
쓰레드의 동기화(3) Lock과 Condition을 이용한 동기화 동기화 할 수 있는 방법은 synchronized블럭 외에도 java.util.concurrent.locks패키지가 제공하는 lock클래스들을 이용하는 방법이 있다. lock 클래스의 종류는 다음과 같다. ReentrantLock // 재진입이 가능한 lock, 가장 일반적인 배타 lock ReentrantReadWriteLock //읽기에는 공유적이고, 쓰기에는 배타적인 lock StampedLock //ReentrantReadWriteLock 에 낙관적인 lock의 기능을 추가 ReentrantLock 은 가장 일반적인 lock이다. reentrant(재진입할 수 있는)이라는 단어가 앞에 붙은 이유는 우리가 앞서 wait(), notify()에서 배운것 처.. 2021. 10. 15.
쓰레드의 동기화(2) 동기화 하는 이유 : 한 쓰레드가 진행 중인 작업을 다른 쓰레드가 간섭하지 못하도록 막기위함 동기화의 단점이 동기화를 하면 데이터는 보호는 되지만 비효율적이다. 한번에 한쓰레드만 사용되니까! 그래서 동기화를 하면 프로그램의 효율이 떨어진다. 그래서 그 떨어진 효율을 높이기 위해서 만들어진 메서드가 wait, notify를 사용한다. 즉 synchronized로 동기화 해서 공유 데이터를 보호하는 것 까지는 좋은데, 특정 쓰레드가 객체의 락을 가진 상태로 오랜 시간을 보내지 않도록 하는 것도 중요하다. 만일 계좌에 추름할 돈이 부족해서 한 쓰레드가 락을 보유한 채로 돈이 입금될때까지 오랜시간을 보낸다면, 다른 쓰레드들은 해당 객체의 락을 기다리느라 다른 작업들도 원활히 진행되지 않기 때문이다. 이러한 상황.. 2021. 10. 15.
쓰레드의 동기화 싱글 쓰레드 프로세스의 경우 프로세스 내에서 단 하나의 쓰레드만 작업하기 때문에 프로세스의 자원을 가지고 작업하는데 별 문제가 없지만, 멀티 쓰레드 프로세스에서는 다른 쓰레드의 작업에 영향을 미칠 수 있다. 만일 쓰레드 A가 작업도중에 다른 쓰레드 B에게 제어권이 넘어갔을때, 쓰레드A가 작업하던 공유데이터를 B가 임의로 변경하였다면, A가 제어권을 받아 나머지 작업을 마쳤을때, 원래 의도했던 것과는 다른 결과를 얻을 수 있다. 멀티쓰레드 프로세스에서는 여러 쓰레드가 같은 자원을 공유하기 때문에 메모리도 공유함, 어떤 한 쓰레드가 작업하는 것을 마치지 못하고 다른쓰레드에게 차례가 넘어갔을 때 그 쓰레드가 다른 쓰레드에게 영향을줄 수가있다. 그래서 작업이 끝나지 않은 경우에 다른쓰레드가 다른쓰레드가 그 작업.. 2021. 10. 15.
쓰레드 제어문(2) interrupt() 대기상태( waiting)인 쓰레드를 실행대기 상태로 만든다. 잠자거나, 쉬고있거나 등등 진행 중인 쓰레드의 작업이 끝나기 전에 취소시켜야 할 때가 있다. 예를 들어 큰 파일을 다운로드 받을때 시간이 너무 오래 걸리면 중간에 다운로드를 포기하고 취소할 수있어야 한다. interrupt는 쓰레드에게 작업을 멈추라고 요청하는 것이다. 단지 멈추라고 요청만 하는 것일 뿐 쓰레드를 강제로 종료시키지는 못한다! void interrupt() //쓰레드의 interrypted상태를 false에서 true로 변경, boolean isInterrupted() //쓰레드의 interrupted 상태를 반환 static boolean interrupted() // 현재 쓰레드의 interrupted상.. 2021. 10. 13.
쓰레드 제어문(1) Sleep() -현재 쓰레드를 지정된 시간동안 멈추게 한다. static void sleep(long millis); static void sleep(long millis, int nanos); -static 메서드인 특성상 자기 자신만 제어할 수있다. 다른 쓰레드를 제어할 순없다. 매개변수 내에 잠잘 시간을 정해준다. 밀리세컨드(3초 = 3000밀리세컨드)와 나노세컨드의 시간단위로 세밀하게 값을 지정할 수 있지만 어느정도 오차가 발생할 수 있다. try{ Thread.sleep(1, 500000); }catch(InterruptedException e){} sleep()메서드는 예외를 발생시킬수 있으므로 예외문과 함께 다닌다. Exception 클래스의 자손인 InterruptedException이기 .. 2021. 10. 13.
데몬 쓰레드와 쓰레드의 상태(실행제어) 데몬쓰레드란? 데몬쓰레드 : 일반 쓰레드의 작업을 돕는 보조적인 역할을 수행한다. 일반쓰레드가 종료되면 데몬 쓰레드는 강제적으로 자동 종료된다. 즉 데몬쓰레드가 아닌 쓰레드가 종료되면 데몬쓰레드는 모두 종료된다. 어떤 쓰레드가 대표적으로 사용되는가? 가비지 컬렉터, 자동저장, 화면, 자동갱신 등 쓰지않는 메모리를 제거하거나, 워드에서 자동저장(시간이 셋팅되어있으면), 화면 자동갱신(자동 새로고침 등) 그럼 데몬쓰레드는 어떻게 작성하는가? public void run(){ while(true) try{ Thrad.sleep(3*1000); //3초마다 }catch(InterruptedException e) {} //autoSave값이 true면 autoSave()를 호출한다. if(autoSave){ au.. 2021. 10. 12.
쓰레드의 우선순위, 그룹 쓰레드의 우선순위 쓰레드는 우선순위라는 속성을 가지고 있다.(멤버변수) 이 우선순위 값에 따라 쓰레드가 얻는 실행시간이 달라진다. 쓰레드가 수행하는 작업의 중요도에 따라 쓰레드의 우선순위를 서로 다르게 지정하여 쓰레드가 더 많은 작업시간을 갖도록 할 수있다. -즉 더 중요한 쓰레드에게 우선순위를 높게 주어서 더 많은 작업시간을 가지게 할 수 있다는 것 자바에서 쓰레드의 우선순위를 1~10까지 보유할 수있다. 기본적으로 보통우선순위는 5, 최소 우선순위는1, 최대 우선순위는 10이다. 우리가 생성하고, 아무것도 지정하지않으면 5, 기본값을 얻게된다. void setPriority(int newPriority) // 쓰레드의 우선순위를 지정한 값으로 변경 int getPriority() //쓰레드의 우선순위.. 2021. 10. 12.
싱글쓰레드와 멀티쓰레드 main쓰레드 main 메서드 의 코드를 수행하는 쓰레드 예를들어 우리가 main메서드를 실행하면 위가 바로 메인쓰레듣가 쓰레드는 사용자쓰레드와 데몬쓰레드, 두 종류가 있다. 데몬쓰레드 : 간단히 얘기해서 사용자 쓰레드의 보조 역할, 더보기 실행 중인 사용자 쓰레드가 하나도 없을 때 프로그램은 종료된다. 메인쓰레드가 종료되면 전체 프로그램이 종료되었지만, 멀티쓰레드 프로그램에서 아직 실행중인 쓰레드가 있다면 프로그램은 종료되지 않는다. 싱글쓰레드와 멀티쓰레드 프로스세의 차이를 보다 깊이 알아보자 하나의 쓰레드로 두개의 작업을 수행을 시켜보자, AAAAABBBBB 한개의 쓰레드가 끝나고 두번째 쓰레드가 시작된다. 그런데 또다른 프로그램은 두개의 쓰레드로 두개의 작업 수행시키면 ABABABABAB 번갈아 가.. 2021. 10. 8.
쓰레드의 구현과 실행 Tread클래스를 상속 이것은 하나만 상속받을 수 있는 자바언어 특성상 쓰레드를 상속받자니 조금 아쉽다. class MyThread extends Thread{ public void run(){ //쓰레드클래스의 run() 을 오버라이딩 } } Rubbable 인터페이스 상속(이게좀더 좋다) 인터페이스를 상속받으니 다른 클래스를 상속을 받을 수 있기에 class MyThread2 implements Runnable{ public void run(){ //Runnable 인터페이스의 추상메서드 run()을 구현 } } 두 상속된 것을 보면 (인터페이스와 클래스) 둘다 run()매서드를 가지고있다. 그래서 클래스를 쓰냐 인터페이스를 쓰냐 고민할 게없다. 둘다 같은 기능을 한다.! 문서에서도 쓰레드 클래스에 .. 2021. 10. 7.
프로세스와 쓰레드 프로세스와 쓰레드(process & thread) 프로세스 : 실행 중인 프로그램, 자원(메모리, 씨피유)과 쓰레드로 구성-프로그램을 실행하면 OS로 부터 실행에 필요한 자원(메모리)를 할당 받아 프로세스가 된다. 프로세스의 자원을 이용해서 실제로 작업을 수행하는 것이 바로 쓰레드 쓰레드 : 프로스세스 내에서 실제 작업을 수행 더보기 모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다, 프로세스 : 쓰레드 = 공장 : 일꾼 그럼 싱글 쓰레드 프로세스(일꾼 한명!) = 자원 + 쓰레드 멀티 쓰레드 프로세스(일꾼 여러명!) = 자원+쓰레드+쓰레드 ... + 쓰레드 멀티쓰레드로 프로그램을 작성하면 여러작업을 나누어서 동시에 수행할 수 있고 보다 작업을 효율적으로 할 수있고, 우리프로그램은 대부분 멀티 쓰레드로.. 2021. 10. 7.
728x90
반응형
LIST