-
Thread 스레드 (2) / synchronized프로그래밍/JAVA 자바 2021. 9. 6.반응형
synchronized = 동기화
스레드간 동기화를 하지 않고, 멀티 스레드를 돌리면 안정성과 신뢰성이 바닥이다.
그렇다고 synchronized를 너무 많이 쓰면 프로그램의 성능 저하가 일어난다.
synchronized 란?
여러개의 스레드가 한개의 자원을 사용할때 현재 사용되고 있는 스레드를 제외하고,
나머지 스레드들은 데이터에 접근 할 수 없도록 막는 개념
package threadEx2; public class Ex002_Synchronized { public static void main(String[] args) { MyBank2 b = new MyBank2(); Thread t1 = new Thread(b); Thread t2 = new Thread(b); t1.start(); t2.start(); } } // 동기화 한 경우 class MyBank2 implements Runnable { private int money = 10000; public void run() { int need = 6000; int n = 0; String msg = null; try { synchronized (this) { // 동기화 블럭 if(getMoney() >= need) { Thread.sleep(200); n = drawMoney(need); msg = "인출 성공"; } else { n = 0; msg = "인출 실패"; } } System.out.println(msg+", 인출금액:"+n+",잔고:"+getMoney()); } catch (Exception e) { e.printStackTrace(); } } public int getMoney() { return money; } private int drawMoney(int m) { money -= m; return m; } }
- 스레드를 만들고 스레드할 작업 위에 synchronized() 동기화 블럭을 생성
- 그리고 메인 함수에서 객체 생성및 스레드 객체 생성하고 실행
- money 인출 중(스레드 작업중)에는 동기화가 되어 있어서 제대로 작동 된다.
package threadEx2; public class Ex004_Synchronized { public static void main(String[] args) { ShareData2 share = new ShareData2(); UpThread2 t1 = new UpThread2(share, "up"); DownThread2 t2 = new DownThread2(share, "down"); t1.start(); t2.start(); } } // 동기화 한 경우 - synchronized 메소드 class ShareData2 { private int num = 100; public synchronized void up(String title) { System.out.print(title+":"+num); num++; System.out.println(", 증가->"+num); } public synchronized void down(String title) { System.out.print(title+":"+num); num--; System.out.println(", 감소->"+num); } } class UpThread2 extends Thread { private ShareData2 share; private String title; public UpThread2(ShareData2 share, String title) { this.share = share; this.title = title; } public void run() { for(int i=0; i<5; i++) { try { sleep(500); share.up(title); } catch (Exception e) { } } } } class DownThread2 extends Thread { private ShareData2 share; private String title; public DownThread2(ShareData2 share, String title) { this.share = share; this.title = title; } public void run() { for(int i=0; i<5; i++) { try { sleep(500); share.down(title); } catch (Exception e) { } } } }
- 100에서 1씩 업 다운하는 스레드 프로그램
- 업, 다운을 값을 공유하는 클래스 하나를 만들어서 업 함수, 다운 함수를 만든다.
- 그리고 스레드 2개를 업 다운 각각 하나씩 만든다.
- 한 스레드는 업만 5번하고 다른 하나는 다운만 5번 한다.
- 그리고 메인에서 업 다운 각각 객체를 생성하고 실행한다.
- synchronized 동기화로 인해서 서로 간섭 안하는걸 확인 할 수 있다.
반응형'프로그래밍 > JAVA 자바' 카테고리의 다른 글
자바 UI swing / 버튼 추가 해보기 JFrame (0) 2021.09.07 스레드(3) Timer 클래스 / wait (0) 2021.09.07 프로세스, 쓰레드 Thread (0) 2021.09.05 자바DB / CallableStatement (0) 2021.09.02 자바DB연동 / PreparedStatement 활용 예제 (0) 2021.08.30