jacketList

[Java] 동기(Synchronous)와 비동기(Asynchronous) λ³Έλ¬Έ

Java

[Java] 동기(Synchronous)와 비동기(Asynchronous)

ukkkk7 2023. 12. 8. 16:47
728x90
λ°˜μ‘ν˜•

 

🧐 동기(Synchronous)λž€?

사전적 의미둜 λ™μ‹œμ„±μ˜, λ™μ‹œμ˜ λΌλŠ” 뜻으둜 말 κ·ΈλŒ€λ‘œ λ™μ‹œμ— μΌμ–΄λ‚œλ‹€λŠ” λœ»μ΄λ‹€.

 

 

κ·Έλ¦Όκ³Ό 같이 μ½œμ„Όν„°κ°€ μžˆλ‹€κ³  가정을 ν•œλ‹€λ©΄ 동기식 μΌμ²˜λ¦¬λŠ” 고객1μ—κ²Œ μ „ν™”κ°€ 였면 μ‘λŒ€λ₯Ό ν•΄ 처리λ₯Ό 해쀄 λ™μ•ˆ 고객2, 고객3은 λŒ€κΈ°ν•˜κ³  μžˆλ‹€. 이후 고객1의 μ‘λŒ€κ°€ λλ‚˜λ©΄ 고객2 -> 고객3의 순으둜 μ²˜λ¦¬ν•˜λŠ” 방식이닀.

 

이와같은 동기 λ°©μ‹μ˜ νŠΉμ§•μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • μš”μ²­μ„ 보내고 싀행이 λλ‚˜λ©΄ λ‹€μŒ λ™μž‘μ„ μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ μˆœμ„œμ— 맞좰 μ§„ν–‰λ˜κΈ° λ•Œλ¬Έμ— μ œμ–΄κ°€ 쉽닀.
  • μ—¬λŸ¬κ°€μ§€ μš”μ²­μ„ λ™μ‹œμ— μ²˜λ¦¬ν•  수 μ—†μ–΄ 효율이 λ–¨μ–΄μ§„λ‹€.

 

μ•„λž˜λŠ” λ™κΈ°μ‹μœΌλ‘œ λ™μž‘ν•˜λŠ” μ½”λ“œμ΄λ‹€.

package Synchro_Asynchro;

public class Synchro {
	public static void main(String[] args) {
		
		method1();
		method2();
		method3();
		
	}
	
	public static void method1() {
		System.out.println("method1");
	}
	public static void method2() {
		System.out.println("method2");
	}
	public static void method3() {
		System.out.println("method3");
	}
	
}

 

μž‘μ—…μ˜ κ²°κ³ΌλŠ” 순차적으둜 1 -> 2 -> 3이 λœλ‹€

 

 

🧐 비동기(Asynchronous)λž€?

사전적 의미둜 λΉ„λ™μ‹œμ„±μ˜ λΌλŠ” 뜻으둜 말 κ·ΈλŒ€λ‘œ λ™μ‹œμ— μΌμ–΄λ‚˜μ§€ μ•ŠλŠ” 것을 μ˜λ―Έν•œλ‹€.

 

비동기 방식은 우리의 μΌμƒμƒν™œ μ†μ—μ„œλ„ μ°Ύμ•„λ³Ό 수 μžˆλŠ”λ° 예λ₯Όλ“€μ–΄ μΉ΄μΉ΄μ˜€ν†‘μ„ 톡해  A -> Bμ—κ²Œ λ©”μ‹œμ§€λ₯Ό λ³΄λƒˆλ‹€κ³  κ°€μ •ν•΄λ³΄μž. AλŠ” Bμ—κ²Œ λ‹΅μž₯이 올 λ•Œ λ™μ•ˆ 기닀리지 μ•Šμ•„λ„ Cμ—κ²Œ λ°”λ‘œ λ©”μ‹œμ§€λ₯Ό 보낼 수 μžˆλ‹€. 이처럼 비동기 방식은 μž‘μ—…μ΄ λ™μ‹œμ— μΌμ–΄λ‚˜μ§€ μ•Šκ³  μž‘μ—… μ²˜λ¦¬κΈ°κ°„μ΄ μΌμΉ˜ν•˜μ§€ μ•Šμ•„λ„ 되고, 응닡을 기닀리지 μ•Šκ³  λ‹€λ₯Έ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆλ‹€.

 

λΉ„λ™κΈ°λŠ” μ•„λž˜μ™€ 같은 νŠΉμ§•μ„ κ°–λŠ”λ‹€

  • μš”μ²­μ„ 보내고 ν•΄λ‹Ή λ™μž‘μ˜ 처리 여뢀와 상관없이 λ‹€μŒ μš”μ²­μ΄ λ™μž‘ν•˜λŠ” λ°©μ‹μœΌλ‘œ μžμ›μ„ 효율적으둜 μ‚¬μš©ν•  수 μžˆλ‹€.
  • 동기보닀 섀계가 λ³΅μž‘ν•˜λ‹€.

 

μ•„λž˜λŠ” λΉ„λ™κΈ°μ‹μœΌλ‘œ λ™μž‘ν•˜λŠ” μžλ°” μ½”λ“œμ΄λ‹€.

package Synchro_Asynchro;

public class Asynchro {
	public static void main(String[] args) {
	
	
		Thread t = new Thread(()->{
			method1();
		});
		Thread t2 = new Thread(()->{
			method2();
		});
		Thread t3 = new Thread(()->{
			method3();
		});
		
		
		t.start();
		t2.start();
		t3.start();
		
	}
	
	public static void method1() {
		System.out.println("method1");
	}
	public static void method2() {
		System.out.println("method2");
	}
	public static void method3() {
		System.out.println("method3");
	}
}

 

μžλ°”μ—μ„œλŠ” 기본적으둜 Multi Thread의 λ™μž‘μ΄ λΉ„λ™κΈ°μ‹μœΌλ‘œ μž‘λ™ν•œλ‹€.

μ½”λ“œλ₯Ό 보면 각 Thread객체에 λ©”μ†Œλ“œλ₯Ό λ‹΄μ•„ startλ©”μ†Œλ“œλ₯Ό μˆ˜ν–‰μ‹œν‚¨λ‹€. 

λ™κΈ°μ‹μ˜ κ²½μš°μ˜€λ‹€λ©΄ method1 -> method2 -> method3 의 μˆœμ„œλŒ€λ‘œ 순차 싀행이 λ˜μ—ˆμ„ ν…Œμ§€λ§Œ

 

 

μœ„μ™€κ°™μ€ κ²°κ³Όκ°€ λ‚˜μ˜¨λ‹€. 항상 μ΄λŸ°μ‹μœΌλ‘œ μˆœμ„œκ°€ λ‚˜μ˜€λŠ” 것이 μ•„λ‹ˆλΌ μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ μˆœμ„œκ°€ 계속 바뀐닀. 즉 처리 μˆœμ„œλŠ” 보μž₯이 μ•ˆλœλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

 

 

κ°„λ‹¨ν•˜κ²Œλ§Œ μ •λ¦¬ν•œ 것이기 λ•Œλ¬Έμ— 좔후에 μΆ”κ°€μ μœΌλ‘œ 더 μžμ„Ένžˆ 적어봐야겠닀..

 

 

references

 

https://webheck.tistory.com/entry/Java%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B0%A9%EC%8B%9DAsynchronous-processing-model

https://metaverse-cloud.tistory.com/76

728x90
λ°˜μ‘ν˜•