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

JAVA공부/2-쓰레드14

쓰레드의 동기화(4) volatile 싱글 코어 프로세서가 장착된 컴퓨터에서는 크게 문제가 없이 실행될 것이다. 그러나 요즘 대부분 멀티코어 프로세서가 장착된 컴퓨터를 사용하기 때문에, 문제가 많아질 수 있다. 왜냐하면 멀티 코어 프로세서에서 코어마다 별도의 캐시를 가지고 있기 때문이다. 코어는 메모리에서 읽어온 값을 캐시에 저장하고 캐시에서 값을 읽어서 작업한다. 다시 같은 값을 읽어올때는 머넞 캐시에 있는지 확인하고 없을 때만 메모리에서 읽어온다. 그러다보니 도중에 메모리에 저장된 변수의 값이 변경되었는데도 캐시에 저장된 값이 갱신되지 않아서 메모리에 저장된 값이 다른 경우가 발생한다. 그래서 변수 stopped의 값이 바뀌었는데도 쓰레드가 멈추지않고 계속 실행된다. 변수에 volatile을 붙이는 대신에 synchron.. 2021. 10. 16.
쓰레드의 동기화(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.
쓰레드 제어문(4) join() 지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다. 무슨말이야 A라는 쓰레드와 B라는 쓰레드가 있는데 A라는 작업을 하다가 B가 작업을 끝낸뒤 A쓰레드가 더 진행되게 하도록 해준다. void join() //작업이 모두 끝날 때까지 void join(long millis) // 천분의 일초동안 void join(long, millis, int nanos) // 천분의 일초 + 나노초 동안 그리고 sleep() 와 동일하게 에외처리를 한다. try{ t1.join(); }catch(InterruptedException e){} 만약 interrupt가 발생하면 멈추던걸 멈추고 실행한다. 시간을 지정하지 않으면 , 해당 쓰레드가 작업을 모두 마칠때까지 기다린다. 작업 중에 다른 쓰레드의 작업.. 2021. 10. 14.
쓰레드 제어문(3) suspend(), resume(), stop() 쓰레드의 실행을 일시정지, 재개, 완전정지 시키는 메서드에 대해 알아보자! void suspend() //쓰레드를 일시정지 시킨다. void resume() //suspend()에 의해 일시정지된 쓰레드를 실행대기 상태로 만든다. void stop() //쓰레드를 즉시 종료시킨다. 우선 쓰레드의 생성주기를 다시 복습해보자 쓰래드는 생선된다 (new!) 그리고 start() 당한다. 그리고 자기차례때 줄서다가 진짜 실행이되고, 그사이사이 waiting, bloked 당하고 시간이 다되어 종료되되고 그런다. 그런데 suspend, resume, stop 메서드들은 쓰레드의 실행을 제어하는 가장 손쉬은 방법이지만, 교착상태를 일으키기 쉽게 작성되어있어서 권장하.. 2021. 10. 14.
쓰레드 제어문(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.
쓰레드 제어문(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.
728x90
반응형
LIST