일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 프로그래밍
- 테이블
- 객체지향
- 자바
- orcle
- 웹
- javascript
- web
- sql
- squery
- html
- ERWin
- 객체지향프로그래밍
- 공부
- Java
- DB
- 프로젝트
- jsp
- Project
- CSS
- Oracle
- 객제지향
- 코딩
- 웹프로그래밍
- 데이터베이스
- 주말이다..
- 공부를열심히
- 객제지향프로그래밍
- 오라클
- UI
- Today
- Total
햄찌개
JAVA - 쓰레드 synchronized 동기화 본문
동기화 메소드 및 동기화 블록 - Synchronized
멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역을 임계 영역(critical section)이라고 한다. 자바는 임계 영역을 저장하기 위해 동기화(synchronized) 메소드와 동기화 블록을 제공한다. 스레드가 객체 내부의 동기화 메소드 또는 블록에 들어가면 즉시 객체에 잠금을 걸어 다른 스레드가 임계 영역 코드를 실행하지 못하도록 한다. 동기화 메소드를 만드는 방법은 메소드 선언에 synchronized 키워드를 붙이면 된다. synchronized 키워드는 인스턴스와 정적 메소드 어디든 붙일 수 있다.
-
단 하나의 스레드만 실행할 수 있는 메소드 또는 블록을 말한다.
-
다른 스레드는 메소드나 블록의 실행이 끝날 때까지 대기해야 한다.
-
동기화 메소드
동기화 메소드는 메소드 전체 내용이 임계 영역이므로 스레드가 동기화 메소드를 실행하는 즉시 객체레는 잠금이 일어나고, 스레드가 동기화 메소드를 실행 종료하면 잠금이 풀린다. 메소드 전체 내용이 아니라, 일부 내용만 임계 영역으로 만들고 싶다면 아래와 같이 동기화 블록을 만들면 된다.
public synchronized void method() {
임계 영역; //단 하나의 스레드만 실행
} -
동기화 블록
동기화 블록의 외부 코드들은 여러 스레드가 동시에 실행할 수 있지만, 동기화 블록의 내부 코드는 임계 영역이므로 한 번에 한 스레드만 실행할 수 있고 다른 스레드는 실행할 수 없다. 만약 동기화 메소드와 동기화 블록이 여러 개 있을 경우, 스레드가 이들 중 하나를 실행할 때 다른 스레드는 해당 메소드는 물론이고 다른 동기화 메소드 및 블록도 실행할 수 없다. 하지만 일반 메소드는 실행이 가능하다.
public vod method () {
//여러 스레드가 실행 가능한 영역
...
synchronized(공유객체) {
임계 영역; //단 하나의 스레드만 실행
}
//여러 스레드가 실행 가능한 영역
...
}
* synchronized 사용하면 한놈만 접근가능
* 다른 놈은 대기 (BLOCKED 상태)
public class T15_SyncThreadTest {
/**
* synchronized 사용하면 한놈만 접근가능
* 다른 놈은 대기 (BLOCKED 상태)
*/
public static void main(String[] args) {
ShareObject sObj = new ShareObject();
WorkerThread th1 = new WorkerThread("1번 쓰레드 ", sObj);
WorkerThread th2 = new WorkerThread("2번 쓰레드 ", sObj);
th1.start();
th2.start();
}
}
//공통으로 사용할 객체
class ShareObject{
private int sum = 0;
// 동기화 하는 방법 1 : 메서드 자체에 동기화 처리하기
// public synchronized void add() {
public void add() {
//동기화 하는 방법 2 : 동기화 블럭으로 설정하기
synchronized (this) {
for (int i = 0; i <1000000000; i++) {} //동기화 처리 전까지의 시간벌기용
int n = sum;
n+=10; //10증가
sum =n;
System.out.println(Thread.currentThread().getName()+"합계 : "+sum);
}
}
}
//작업을 수행하는 쓰레드 클래스
class WorkerThread extends Thread{
ShareObject sObj;
public WorkerThread(String name, ShareObject sObj) {
super(name);
this.sObj = sObj;
}
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
sObj.add();
}
}
}
'고급 JAVA' 카테고리의 다른 글
JAVA - 쓰레드 예제 - 은행 입출금 - Lock (0) | 2020.09.23 |
---|---|
JAVA - 쓰레드 예제 - 은행 입출금 -synchronized (0) | 2020.09.23 |
JAVA - 쓰레드에서 데이터 공통 사용 (0) | 2020.09.23 |
JAVA - 쓰레드 stop()메소드 (0) | 2020.09.23 |
JAVA - 쓰레드 Yield() (0) | 2020.09.23 |