일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 스프링시큐리티
- securityconfig
- Session1이 그 모든 클라이언트의 저올
- ㅂ
- ㅇㅇㅇㄴㅇ
- WebSecurity
- 스프링 #스프링 시큐리티 #spring security
- WebConfigurerAdapter
- Spring Security
- HttpSecurity
- Today
- Total
다오의 개발일지
쓰레드의 상태와 제어 본문
쓰레드의 상태
sleep() 메서드
현재 쓰레드를 지정된 시간동안 멈추게 한다.
sleep() 쓰레드는 자기자신에 대해서만 멈추게 할 수 있다.
interrupt()메서드
이릿정지 상태인 쓰레드를 실행 대기상태로 만든다.
아래 코드를 보면 Thread.sleep메서드로 인해 1초동안 sleep상태가 되도록 설정되어있지만
Thread를 실행하자마자 interrupt를 걸어 runnable상태로 간 것을 알 수 있다.
join()
정해진 시간동안 지정한 쓰레드가 작업하는 것을 기다린다.
시간을 지정하지 않았을 때는 지정한 쓰레드의 작업이 끝날때까지 기다린다.
사용방법
Thread thread = new Thread(task, "thread");
Thread.start();
try{
Thread.join();
}catch (InterruptedException e){
e.printStackTrace();
}
위 코드는 메인쓰레드가 thread의 작업을 마칠 때까지 기다린다.
- Join또한 interrupt()를 만나면 기다리는 것을 멈추기 때문에 InterruptedException이 발생할 수 있다.
yield()
남은 시간을 다음 쓰레드에게 양보하고 쓰레드 자신은 실행대기 상태가 된다.
synchronized
한 쓰레드가 진행중인 작업을 다른 쓰레드가 침범하지 못하도록 막는것을 쓰레드 동기화(synchronization)이라고 한다.
동기화를 하려면 다른 쓰레드의 침범을 막아야 하는 코드들을 '임계영역'으로 설정한다.
임계영역에는 Lock을 가진 하나의 쓰레드만 사용 가능하다.
wait(), notify()
침범을 막은 코드를 수행하다가 작업을 더 이상 진해앟ㄹ 상황이 아니면, wiat()을 호출하여 쓰레드가 Lock을 반납하고 기다리게 할 수 있다.
- 그러면 다른 쓰레드가 락을 얻어 해당 객체에 대한 작업을 수행 할 수 있게 되고,
- 추후에 작업을 진행할 상황이 되면 notify()를 호출하여
- 작업을 중단했던 쓰레드가 다시 Lock을 얻어 진행할 수 있게 된다.
- wait()
실행중이던 쓰레드는 해당 객체의 waiting pool에서 notify()를 기다린다.
- notify()
Waiting pool에 있는 모든 쓰레드 중 에서 임의의 쓰레드만 통지를 받는다.
Lock, Condition
- Lock
Synchronized 블럭으로 동기화하면 자동적으로 lock이 걸리고 풀리지만, 같은 메서드 내에서만 lock을 걸 수 있다는 제약이 있다.
이런 제약을 해결하기 위해 Lock클래스를 사용한다
ReentrantLock
재진입이 가능한 Lock, 가장 일반적인 배타 Lock
특정 조건에서 Lock을 풀고, 나중에 다시 Lock을 얻어 임계영역으로 진입이 가능하다.
Public class MyClass {
Private Object lock1 = new Object();
Private Object lock2 = new Object();
Public void methodA(){
Synchronized (lock1) {
methodB();
}
}
Public void methodB(){
Synchronized (lock2) {
//do something
methodA();
}
}
ReentrantReadWriteLock
- 읽기를 위한 Lock과 쓰기를 위한 Lock을 따로 공유
- 읽기에는 공유적, 쓰기에는 베타적인 Lock
- Read-onlyLock이라고도 불린다.
StampedLock
- ReentarantReadWriteLock에 낙관적인 Lock의 가능을 추가했다.
- 낙관적인 Lock : 데이터를 변경하기 전에 락을 걸지 않는 것을 말한다. 낙관적인 락은 데이터 변경을 할 때 충돌이 일어날 가능성이 적은
상황에서 사용한다.
'JAVA' 카테고리의 다른 글
컬렉션 프레임워크 -1 List, ArrayList, LinkedList (4) | 2023.06.11 |
---|---|
자바 8 이후 시간을 다루는 LocalDateTime 클래스와 DateTimeFormatter클래스 (0) | 2023.06.04 |
프로세스와 쓰레드 (1) | 2023.06.01 |
Java.lang 패키지, java,util 패키지에서 자주 사용하는 클래스 (1) | 2023.05.30 |
String / StringBuilder / StringBuffer 차이점 & 성능 비교 (0) | 2023.05.29 |