μžλ°”μ—μ„œ λ™μ‹œμ„±μ€ μ™œ λ°œμƒν• κΉŒ?

2025. 3. 23. 23:09Β·πŸ“‚ programming-language/java

 ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λ‹€ 보면 κ³ λ € 사항 쀑 ν•˜λ‚˜κ°€ λ™μ‹œμ„±μ΄λ‹€. λ™μ‹œμ„±μ΄ μ™œ λ°œμƒν•˜λŠ”μ§€μ— κ΄€ν•œ 고민의 흐름을 μ •λ¦¬ν•˜κ³ μž κΈ€λ‘œ μž‘μ„±ν•˜κ³ μž ν•œλ‹€.

 

1. μžλ°” μ½”λ“œλŠ” μ–΄λ–»κ²Œ μ‹€ν–‰λ κΉŒ?

μžλ°” μ½”λ“œλŠ” μ–΄λ–»κ²Œ μ‹€ν–‰λ κΉŒ? μžλ°”λŠ” 기본적으둜 컴파일 언어이닀. 컴파일 μ–Έμ–΄λž€ μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° 이전에 컴파일러(compiler) λ₯Ό 거쳐 μ†ŒμŠ€ μ½”λ“œλ₯Ό κΈ°κ³„μ–΄λ‘œ λ²ˆμ—­ν•˜λŠ” 과정을 κ±°μΉ˜λŠ” μ–Έμ–΄λ₯Ό λ§ν•œλ‹€.

 

μžλ°”λŠ” μžλ°” 컴파일러λ₯Ό ν†΅ν•΄μ„œ μ†ŒμŠ€ νŒŒμΌμ„ μžλ°” λ°”μ΄νŠΈ μ½”λ“œλ‘œ λ³€ν™˜ν•œλ‹€. λ³€ν™˜λœ λ°”μ΄νŠΈ μ½”λ“œλŠ” λŸ°νƒ€μž„ ν™˜κ²½μ—μ„œ JVM(Java Virtual Machine) 을 톡해 OS κ°€ 읽을 수 μžˆλŠ” 기계어(binary code) 둜 λ³€ν™˜ν•˜κ³ , λ³€ν™˜λœ κΈ°κ³„μ–΄λŠ” OS κ°€ 읽어 λͺ…령을 μˆ˜ν–‰ν•˜κ²Œ λœλ‹€.

ref : https://tcpschool.com/java/java_intro_programming

 

 

2. λ™μ‹œμ„±μ΄ λ°œμƒ 지점인 곡유 μžμ›μ€ μ–΄λŠ μ˜μ—­μΌκΉŒ?

λ™μ‹œμ„±κ°€ λ°œμƒν•˜λŠ” 상황을 μ •μ˜ν•˜λ©΄ μ—¬λŸ¬ μŠ€λ ˆλ“œ ν˜Ήμ€ ν”„λ‘œμ„ΈμŠ€κ°€ 곡유 μžμ›μ— λ™μ‹œμ— μ ‘κ·Όν–ˆμ„ λ•Œ 데이터 μ •ν•©μ„± κΉ¨μ§€λŠ” ν˜„μƒμ„ λ§ν•œλ‹€. κ·Έλ ‡λ‹€λ©΄ μ–΄λ–€ μ˜μ—­μ΄ 곡유 μ˜μ—­μΌκΉŒ?

 

OS의 ν”„λ‘œμ„ΈμŠ€ λ©”λͺ¨λ¦¬ ꡬ쑰λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ 기본적으둜 code, data, heap, stack μ˜μ—­μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. 

code, data, heap μ˜μ—­μ„ κ³΅μœ ν•˜μ§€λ§Œ, stack μ˜μ—­μ„ 각 μŠ€λ ˆλ“œκ°€ λ…λ¦½μ μœΌλ‘œ κ΄€λ¦¬ν•˜λŠ” 곡간이닀.

즉, ν”„λ‘œμ„ΈμŠ€λŠ” code, data, heap κ°€ 곡유 μžμ› μ˜μ—­μ΄λ―€λ‘œ λ™μ‹œμ„±μ΄ λ°œμƒν•  수 μžˆλŠ” 원인 지점이 될 수 μžˆλ‹€.

(참고둜 data μ˜μ—­λŠ” μ „μ—­ λ³€μˆ˜ 및 정적 데이터λ₯Ό 관리, heap  μ˜μ—­μ€ λ™μ  데이터 관리, code λŠ” ν”„λ‘œκ·Έλž¨ μ†ŒμŠ€ μ½”λ“œλ₯Ό κ΄€λ¦¬ν•œλ‹€.)

 

ref : https://thsd-stjd.tistory.com/149

 

 

JVM μ—μ„œμ˜ λ©”λͺ¨λ¦¬ 관리 μ˜μ—­μ€ Runtime Data Areas 이닀. 컴파일된 μžλ°” λ°”μ΄νŠΈ μ½”λ“œλŠ” μ‹€ν–‰λ˜λ©΄μ„œ Runtime Data Areas μ—μ„œ Method Area 와 Heap μ˜μ—­μ—μ„œ λ©”λͺ¨λ¦¬λ₯Ό κ΄€λ¦¬ν•œλ‹€.

 

μ•žμ„œ OS ν”„λ‘œμ„ΈμŠ€ λ©”λͺ¨λ¦¬ ꡬ쑰와 λ§€μΉ­μ‹œμΌœλ³΄λ©΄ Method Area 은 Data μ˜μ—­, Heap 은  λ§κ·ΈλŒ€λ‘œ Heap κ³Ό λ§€μΉ­λœλ‹€. κ·ΈλŸ¬λ―€λ‘œ μžλ°” 개발자 μž…μž₯μ—μ„œλŠ” 곡유 μžμ› κ²€ν†  μ˜μ—­μ„ μš°μ„ μ μœΌλ‘œ Method Area 와 Heap μ—μ„œ κ΄€λ¦¬ν•˜λŠ” 데이터λ₯Ό κ³ λ €ν•΄μ•Ό ν•œλ‹€.

ref: https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

 

3. μžλ°”λŠ” 기본적으둜 λ™μ‹œμ„±μ„ 보μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

 μžλ°”λŠ” 기본적으둜 λ™μ‹œμ„±μ„ 보μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

ꡬ체적으둜 μ΄μ•ΌκΈ°ν•˜μžλ©΄ μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ 곡유 μžμ›μ— λ™μ‹œμ— μ“°κΈ° μž‘μ—…μ„ ν•˜λŠ” 경우, μˆœμ„œλ₯Ό μ œμ–΄ν•˜μ§€ μ•ŠμœΌλ©΄ 예기치 μ•ŠλŠ” κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. μžλ°”μ—μ„œ μ œκ³΅ν•˜λŠ” 자료 ꡬ쑰인 JCF(Java Collections Framework) λ˜ν•œ 기본적으둜 λ™μ‹œμ„±μ„ 보μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

μ‹€μ œ java docs μ—μ„œ HashMap class λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ ν•΄λ‹Ή ν΄λž˜μŠ€λŠ” λ™μ‹œμ„± μ œμ–΄λ₯Ό ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 문ꡬλ₯Ό 확인할 수 μžˆλ‹€. (Note that this implementation is not synchronized!!)

ref : https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

 

4. λ™μ‹œμ„±μ΄ λ°œμƒν•˜λŠ” 근본적인 이유λ₯Ό μ•Œμ•„λ³΄μž.

μ•„λž˜ μ½”λ“œλŠ” λ™μ‹œμ„± 문제 쀑 ν•˜λ‚˜μΈ κ²½ν•© 쑰건(race condition) 이 λ°œμƒν•˜λŠ” μ½”λ“œμ΄λ‹€.

λ‹¨μˆœνžˆ Heap μ˜μ—­μ— μžˆλŠ” 곡유 μžμ›μ„ λ™μ‹œμ— μ ‘κ·Όν•˜κΈ° λ•Œλ¬Έμ— λ™μ‹œμ„± λ¬Έμ œκ°€ λ°œμƒν•˜λŠ” κ²ƒμΌκΉŒ??

class Main {
	public static void main(String[] args) {
		Audio audio = new Audio("보슀 μ˜€λ””μ˜€", 100_000);

		final Runnable runnable = () -> {
			for (int i = 0; i < 50_000; i++) {
				audio.decrease(1);
			}
		};

		Thread thread1 = new Thread(runnable);
		Thread thread2 = new Thread(runnable);

		thread1.start();
		thread2.start();

		System.out.println("audio.amount = " + audio.amount);
	}

	private static class Audio {
		private String name;
		private int amount;

		public Audio(final String name, final int amount) {
			this.name = name;
			this.amount = amount;
		}

		public Audio(final String name) {
			this.name = name;
		}

		public void decrease(int amount) {
			this.amount -= amount;
		}
	}
}

κΈ°λŒ€κ°’ : amount = 0

 

(1) CPU 기계어 λͺ…령은 기본적으둜 μ›μžμ  연산을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.

OS μ—μ„œ CPU core κ°€ λͺ…령을 μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” 기계어λ₯Ό 읽어 λͺ…령을 μˆ˜ν–‰ν•œλ‹€. ν•˜μ§€λ§Œ, CPU 기계어 λͺ…령은 기본적으둜 μ›μžμ  연산을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. μžλ°” μ½”λ“œμ—μ„œ +1 을 λ”ν•˜λŠ” 연산은 μ½”λ“œ ν•œμ€„λ‘œ λ³΄μ΄μ§€λ§Œ μ‹€μ œλ‘œλŠ” λ©”λͺ¨λ¦¬ λ‘œλ“œ, λ”ν•˜κΈ° μ—°μ‚°, λ©”λͺ¨λ¦¬ μ €μž₯와 같은 μ—¬λŸ¬ μŠ€ν…μ˜ 기계어 λͺ…λ ΉμœΌλ‘œ κ΅¬μ„±λœλ‹€.

 

μ›μžμ  연산을 보μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ˜λ―ΈλŠ” +1 λ”ν•˜κΈ° μ—°μ‚°μ˜ μ—¬λŸ¬ μŠ€ν…μœΌλ‘œ κ΅¬μ„±λœ 기계어 λͺ…령을 λͺ¨λ‘ μ •μƒμ μœΌλ‘œ μˆ˜ν–‰ν•˜κ±°λ‚˜, ν•˜λ‚˜λ„ μ‹€ν–‰λ˜μ§€ μ•Šκ³  μΈν„°λŸ½νŠΈ λœλ‹€λŠ” 의미이며,  κ²½μŸ μƒνƒœμ—μ„œ 두 기계어 μ΄μƒμ˜ μ—°μ‚°μœΌλ‘œ κ΅¬μ„±λœ μ½”λ“œκ°€ μ™„λ£Œν•˜μ§€ μ•Šμ€ μƒνƒœλ‘œ μΈν„°λŸ½νŠΈ 될 경우 데이터 정합성이 κΉ¨μ§€λŠ” ν˜„μƒμ΄ λ°œμƒν•  수 μžˆμŒμ„ λ§ν•œλ‹€.

 

μŠ€λ ˆλ“œ λ™μ‹œμ„± λ°œμƒ 흐름도

 

 

μžλ°”λŠ” 이와 같은 기계어 μ—°μ‚°μ˜ μ›μžμ„±μ„ 보μž₯ν•˜κΈ° μœ„ν•΄

java.util.concurrent.atomic νŒ¨ν‚€μ§€ ν•˜μœ„μ— μ›μžμ  μ—°μ‚°κ³Ό κ΄€λ ¨λœ 클래슀λ₯Ό μ œκ³΅ν•œλ‹€.

 

 

 

(2) CPU 처리 λ°μ΄ν„°λŠ” μ‹€μ‹œκ°„μœΌλ‘œ 메인 λ©”λͺ¨λ¦¬μ— 데이터가 μ €μž₯λ˜μ§€ μ•ŠλŠ”λ‹€.

λ©€ν‹° μŠ€λ ˆλ“œμ—μ„œ κ°€μ‹œμ„±(visibility) 은 곡유 λ³€μˆ˜μ˜ λ³€κ²½ λ‚΄μš©μ΄ ν•œ μŠ€λ ˆλ“œμ—μ„œ λ‹€λ₯Έ μŠ€λ ˆλ“œμ—κ²Œ μ–΄λ–»κ²Œ λ³΄μ΄λŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ°œλ…μ΄λ‹€. 일반적으둜 λ³€κ²½ λ‚΄μš©μ΄ λ©”λͺ¨λ¦¬μ— μ¦‰μ‹œ 반영되기λ₯Ό κΈ°λŒ€ν•˜μ§€λ§Œ μ‹€μ œλ‘œλŠ” κ·Έλ ‡μ§€ μ•Šλ‹€.

 

 μ΄μœ μ€ CPU Cache 이닀. CPU λŠ” λ©”λͺ¨λ¦¬μ˜ 데이터 λ‘œλ”©μœΌλ‘œ μΈν•œ 처리 속도 μ €ν•˜λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 쀑간 κ³„μΈ΅μœΌλ‘œ CPU Cache λ₯Ό λ„μž…ν–ˆλ‹€. 이둜 인해 CPU κ°€ 데이터 μ—°μ‚° κ²°κ³Όλ₯Ό CPU μΊμ‹œμ— 반영 ν•˜λ”λΌλ„ μ‹€μ‹œκ°„μœΌλ‘œ 메인 λ©”λͺ¨λ¦¬μ— λ°˜μ˜ν•˜μ§€ μ•Šμ•„ CPU Cache κ°„μ˜ 데이터 μ •ν•©μ„± λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

ref : https://www.baeldung.com/java-volatile-variables-thread-safety

 

 

 μ΄μ™€ 같은 κ°€μ‹œμ„± 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ μžλ°”μ—μ„œλŠ” volatile ν‚€μ›Œλ“œλ₯Ό μ œκ³΅ν•œλ‹€. 곡유 λ³€μˆ˜μ— volatile ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ CPU κ°€ λͺ…령을 μˆ˜ν–‰ν•  λ•Œ 메인 λ©”λͺ¨λ¦¬μ—μ„œ 곡유 λ³€μˆ˜λ₯Ό 직접 읽어 μˆ˜μ •λœ κ²°κ³Όλ₯Ό λ©”λͺ¨λ¦¬μ—μ„œ μ¦‰μ‹œ λ°˜μ˜ν•˜κΈ° λ•Œλ¬Έμ— κ°€μ‹œμ„± 문제λ₯Ό ν•΄κ²°ν•œλ‹€.

AtomicBoolean μ—μ„œ μ‚¬μš©ν•˜κ³  μžˆλŠ” volatile

 

 

 ν•˜μ§€λ§Œ, λ©€ν‹° μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ 곡유 μžμ›μ— λŒ€ν•΄ N개의 μ“°λ ˆλ“œκ°€ μ“°κΈ°λ₯Ό μ‹œλ„ν•˜λŠ” 경우 메인 λ©”λͺ¨λ¦¬κ°€ 곡유 μžμ›μ— κ΄€ν•œ 동기화λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ™μ‹œμ„± λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμ–΄ μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

2개 이상 μŠ€λ ˆλ“œμ˜ μ“°κΈ° μž‘μ—…μ΄ 곡유 μžμ›μ— μ ‘κ·Όν•˜λ©΄ 정합성을 깨질 수 μžˆλ‹€.

 

 

4. λ™μ‹œμ„±μ„ λ°œμƒν•˜μ§€ μ•ŠμœΌλ €λ©΄ Thread Safe ꡬ쑰둜 λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

λ™μ‹œμ„±μ„ μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ 곡유 μžμ›μ— λ™μ‹œμ— μ ‘κ·Όν•˜λŠ” μƒν™©μ—μ„œ λ°œμƒν•œλ‹€. 이λ₯Ό 경쟁쑰건(race condition) 이라 λΆ€λ₯Έλ‹€. λ™μ‹œμ„± 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 컨셉은 κ°„λ‹¨ν•˜λ‹€. μŠ€λ ˆλ“œ 세이프(Thread Safe) ꡬ쑰가 λ˜λ„λ‘ μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€.

 

μŠ€λ ˆλ“œ μ„Έμ΄ν”„λŠ” 닀쀑 μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— 같은 μ½”λ“œ μ˜μ—­μ— μ ‘κ·Όν•˜κ±°λ‚˜ 데이터λ₯Ό κ³΅μœ ν•  λ•Œ, μ˜¬λ°”λ₯Έ μ‹€ν–‰ κ²°κ³Όλ₯Ό 보μž₯ν•˜λŠ” μ½”λ“œ 속성을 λ§ν•œλ‹€. 곡유 μžμ›μ— 닀쀑 μŠ€λ ˆλ“œκ°€ 접근을 μ œμ–΄ν•˜κ±°λ‚˜ 단일 μŠ€λ ˆλ“œλ§Œ μ ‘κ·Ό κ°€λŠ₯ν•œ ν™˜κ²½μ„ μ‘°μ„±ν•˜λ©΄ λ™μ‹œμ„± μ œμ–΄λ₯Ό ν•  수 μžˆλ‹€.

 

μŠ€λ ˆλ“œ 세이프λ₯Ό 보μž₯ν•˜κΈ° μœ„ν•œ μ „λž΅μœΌλ‘œλŠ” μƒν˜Έ 배제(mutual exclusion) / λΆˆλ³€μ„±(immutabliity) / μŠ€λ ˆλ“œ 둜컬(thead-local) / μ›μžμ  μ—°μ‚°(atomic operation) 등이 있으며 λͺ©μ κ³Ό 방법은 μ•„λž˜μ™€ κ°™λ‹€.

 

μƒν˜Έ 배제 (Mutual Exclusion)

  • λͺ©μ  : μ—¬λŸ¬ 개의 μŠ€λ ˆλ“œκ°€ 곡유 μžμ›(예: λ³€μˆ˜, 데이터 ꡬ쑰, 파일 λ“±)에 λ™μ‹œμ— μ ‘κ·Όν•˜λŠ” 것을 λ°©μ§€ν•˜μ—¬ λ°μ΄ν„°μ˜ 일관성을 μœ μ§€ν•¨.
  • 방법 : 잠금 λ©”μ»€λ‹ˆμ¦˜μ„ κΈ°λ°˜ν•œ 곡유 데이터에 κ΄€ν•œ μ ‘κ·Ό μ œμ–΄.
  • μ˜ˆμ‹œ : synchronized ν‚€μ›Œλ“œ λ˜λŠ”  java.util.concurrent.locks νŒ¨ν‚€μ§€μ˜ λͺ…μ‹œμ  락 클래슀 μ‚¬μš©, μ§€μ—­ λ³€μˆ˜ μ‚¬μš©
  •  

λΆˆλ³€μ„± (Immutability)

  • λͺ©μ  : 객체가 μƒμ„±λœ 이후 μƒνƒœκ°€ λ³€ν•˜μ§€ μ•Šλ„λ‘ ν•˜μ—¬ λ™μ‹œμ„± 문제λ₯Ό 근본적으둜 ν•΄κ²°.
  • 방법 : 객체λ₯Ό λΆˆλ³€μœΌλ‘œ λ§Œλ“€μ–΄, 생성 μ‹œμ μ—λ§Œ 데이터λ₯Ό ν• λ‹Ήν•˜κ³  μ΄ν›„μ—λŠ” λ³€κ²½ν•  수 μ—†κ²Œ 함.
  • μ˜ˆμ‹œ : final keyword λ₯Ό μ‚¬μš©

 

μŠ€λ ˆλ“œ 둜컬 (Thread-Local) 

  • λͺ©μ  : 각 μŠ€λ ˆλ“œλ§ˆλ‹€ 독립적인 데이터λ₯Ό μœ μ§€ν•˜μ—¬ λ‹€λ₯Έ μŠ€λ ˆλ“œμ˜ 접근을 μ°¨λ‹¨ν•˜μ—¬ λ™μ‹œμ„± 문제λ₯Ό ν•΄κ²°.
  • 방법 : 각 μŠ€λ ˆλ“œμ—μ„œ κ³ μœ ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  μ‚¬μš©.
  • μ˜ˆμ‹œ : ThreadLocal μ‚¬μš©, Copy-on-Write 방식 적용 

 

μ›μžμ  μ—°μ‚° (Atomic Operations)

  • λͺ©μ : 데이터에 λŒ€ν•œ 연산을 λΆ„ν•  λΆˆκ°€λŠ₯ν•œ 단일 λ‹¨μœ„λ‘œ λ§Œλ“€μ–΄, λ™μ‹œμ„± 문제 없이 싀행될 수 μžˆλ„λ‘ 지원.
  • 방법: AtomicInteger 같은 μ›μžμ  클래슀 μ‚¬μš© λ˜λŠ” CompareAndSwap(CAS) 같은 μ›μžμ  μ—°μ‚° ν™œμš©.
  • μ˜ˆμ‹œ: μžλ°”μ˜ java.util.concurrent.atomic νŒ¨ν‚€μ§€ λ‚΄ ν΄λž˜μŠ€λ“€.

 

5. 회고

이번 κΈ€μ—μ„œλŠ” μžλ°”μ—μ„œ μ™œ λ™μ‹œμ„±μ΄ λ°œμƒν•˜λ©°, 단일 ν”„λ‘œμ„ΈμŠ€μ—μ„œ λ™μ‹œμ„±μ„ ν•΄κ²° κ°€λŠ₯ν•œ 방법에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄μ•˜λ‹€.

ν•΄λ‹Ή λ‚΄μš©μ—μ„œλŠ” κ²½ν•© 쑰건(race condition) 을 κΈ°λ°˜ν•˜μ—¬ μ΄μ•ΌκΈ°ν–ˆμ§€λ§Œ, λ™μ‹œμ„± λ¬Έμ œμ—λŠ” κ²½ν•© 쑰건 외에 λ°λ“œ 락(dead lock), κΈ°μ•„ μƒνƒœ(starvation) κ³Ό 같은 λ‹€λ₯Έ λ™μ‹œμ„± λ¬Έμ œκ°€ μ‘΄μž¬ν•˜λ―€λ‘œ λ‹€μ–‘ν•œ λ™μ‹œμ„± 문제λ₯Ό κ³ λ €ν•œ 섀계가 ν•„μš”ν•˜λ‹€. λ˜ν•œ μ„œλΉ„μŠ€μ˜ μ„±μž₯에 따라 닀쀑 μ„œλ²„κ°€ κ²°ν•©ν•˜μ—¬ λΆ„μ‚° ν™˜κ²½μ„ 기반으둜 μš΄μ˜ν•˜λ―€λ‘œ λΆ„μ‚° ν™˜κ²½μ—μ„œλŠ” λ³„λ„μ˜ λ™μ‹œμ„± μ œμ–΄ 방법이 ν•„μš”ν•˜λ―€λ‘œ 단일 ν”„λ‘œμ„ΈμŠ€μ˜ κ²½ν•© 쑰건(race condition) λ¬Έμ œμ— λŒ€ν•΄ κ²€ν† ν•œ λ‚΄μš©μž„μ„ λ‹€μ‹œ ν•œλ²ˆ μƒκΈ°μ‹œν‚€μž.

'πŸ“‚ programming-language > java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Virtual Thread 은 λ¬΄μ—‡μΌκΉŒ?  (2) 2025.04.10
Java Local Cache λΉ„κ΅ν•˜κΈ°  (0) 2025.03.09
SerialVersionUIDλ₯Ό μ„ μ–Έν•΄μ•Ό ν•˜λŠ” 이유  (0) 2024.11.28
μžλ°” λΉ„λ™κΈ°λ‘œ 카페 μ½˜μ†” 예제 λ§Œλ“€κΈ°  (0) 2024.11.26
μ–΄λŒ‘ν„° νŒ¨ν„΄(adapter pattern)  (1) 2024.07.09
'πŸ“‚ programming-language/java' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • Virtual Thread 은 λ¬΄μ—‡μΌκΉŒ?
  • Java Local Cache λΉ„κ΅ν•˜κΈ°
  • SerialVersionUIDλ₯Ό μ„ μ–Έν•΄μ•Ό ν•˜λŠ” 이유
  • μžλ°” λΉ„λ™κΈ°λ‘œ 카페 μ½˜μ†” 예제 λ§Œλ“€κΈ°
cooper25
cooper25
  • cooper25
    dev cooper
    cooper25
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (84)
      • πŸ“‚ backend (34)
        • spring (19)
        • architecture (10)
        • test (5)
      • πŸ“‚ computer-science (5)
      • πŸ“‚ programming-language (12)
        • java (12)
      • πŸ“‚ infra (9)
        • mysql (4)
        • redis (2)
        • message-queue (3)
      • πŸ“‚ cloud (2)
        • aws (2)
      • πŸ“‚ frontend (1)
        • react (0)
      • πŸ“‚ education & lecture (16)
        • 인프라 곡방 (11)
        • ν•­ν”Œ λ°±μ—”λ“œ 7κΈ° (5)
      • πŸ“‚ ai (1)
        • claude (1)
      • πŸ“‚ etc (2)
        • 회고 (1)
        • 컨퍼런슀 (1)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    spring
    인프라곡방
    UUID
    μŠ€ν”„λ§μΊ ν”„ ν›„κΈ°
    spring AOP
    JPA
    Redisson
    gof
    데이터 쀑심 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 섀계
    ν•­ν•΄ν”ŒλŸ¬μŠ€
    react
    회고
    nGrinder
    λ™μ‹œμ„±
    spring-batch
    kafka
    mysql
    가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ 섀계
    spring camp 2025
    AWS
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.6
cooper25
μžλ°”μ—μ„œ λ™μ‹œμ„±μ€ μ™œ λ°œμƒν• κΉŒ?
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”