μ°λ λ(thread)
- νλ‘μΈμ€ : μ€ν μ€μΈ νλ‘κ·Έλ¨, μμ(resources)κ³Ό μ°λ λλ‘ κ΅¬μ± = 곡μ₯
- μ°λ λ : νλ‘μΈμ€ λ΄μμ μ€μ μμ μ μννλ κ². λͺ¨λ νλ‘μΈμ€λ μ΅μν νλμ μ°λ λλ₯Ό κ°μ§κ³ μλ€. = μΌκΎΌ

μ°λ¦¬κ° μ¬μ©νκ³ μλ λλΆλΆ νλ‘κ·Έλ¨μ μλμ κ°μ΄ λ©ν° μ°λ λ νλ‘μΈμ€μΈ κ²μ νμΈν μ μλ€.

κ·Έλ¦¬κ³ νλμ μλ‘μ΄ νλ‘μΈμ€λ₯Ό μμ±νλ κ²λ³΄λ€ νλμ μλ‘μ΄ μ°λ λλ₯Ό μμ±νλ κ²μ΄ λ μ μ λΉμ©μ΄ λ λ€!!! κ·Έλ λ€κ³ λ©ν°μ°λ λ νλ‘κ·Έλλ°μ΄ μ₯μ λ§ μλ κ²μ μλλ€.
- μ₯μ
- μμ€ν μμμ λ³΄λ€ ν¨μ¨μ μΌλ‘ μ¬μ©ν μ μλ€.
- CPUμ μ¬μ©λ₯ μ ν₯μμν¨λ€.
- μ¬μ©μμ λν μλ΅μ±μ΄ ν₯μλλ€.
- μμ μ΄ λΆλ¦¬λμ΄ μ½λκ° κ°κ²°ν΄μ§λ€.
- λ¨μ (μμμ 곡μ νλ λ° μμ΄ λ¬Έμ λ°μ)
- λκΈ°νμ μ£Όμν΄μΌ νλ€.
- κ΅μ°©μνκ° λ°μνμ§ μλλ‘ μ£Όμν΄μΌ νλ€.
- κ° μ°λ λκ° ν¨μ¨μ μΌλ‘ κ³ λ₯΄κ² μ€νλ μ μκ² ν΄μΌ νλ€.
μ°Έκ³ λ‘ μ°λ λμ μ’ λ₯μλ μΌλ° μ°λ λμ λ°λͺ¬ μ°λ λκ° μλ€. μ΄λ μλμ μΆκ°λ‘ μ 리νμλ€.
μ°λ λμ ꡬνκ³Ό μ€ν
1. Threadν΄λμ€λ₯Ό μμ
class MyThread extends Thread{
public void run() { //Threadν΄λμ€μ run()μ μ€λ²λΌμ΄λ©
//μμ
λ΄μ©
}
}
2. RunnableμΈν°νμ΄μ€λ₯Ό ꡬν
class MyThread2 implements Runnable{
public void run() { //RunnableμΈν°νμ΄μ€μ μΆμλ©μλ run()μ ꡬν
//μμ
λ΄μ©
}
}
3. μ°λ λ μ€ν
//1λ² λ°©λ²
MyThread t1 = new MyThread(); //μ°λ λμ μμ±
t1.start(); //μ°λ λμ μ€ν
//2λ² λ°©λ²
Runnable r = new MyThread2(); //μ°λ λμ μμ±
Thread t2 = new Thread(r); // Thread(Runnable r)
t2.start(); //μ°λ λμ μ€ν
4. μ°λ λ ꡬν ν΄λμ€
Threadν΄λμ€λ₯Ό μμλ°μΌλ©΄, μμ ν΄λμ€μμ μ‘°μμΈ Threadν΄λμ€μ λ©μλλ₯Ό μ§μ νΈμΆν μ μμ§λ§, Runnableμ ꡬννλ©΄ Threadν΄λμ€μ staticλ©μλμΈ currentThread()λ₯Ό νΈμΆνμ¬ μ°λ λμ λν μ°Έμ‘°λ₯Ό μ»μ΄ μμΌλ§ νΈμΆμ΄ κ°λ₯νλ€.

μ°λ λμ μ€νμ νκΈ° μν΄μλ μ°λ λ μμ± ν start() λ©μλλ₯Ό νΈμΆν΄μΌ μ°λ λκ° μμ μ μμνλ€. κ·Έλ¦¬κ³ μ°λ λκ° μ¬λ¬ κ°μΌ κ²½μ° OSμ μ€μΌμ₯΄λ¬κ° μ€ν μμλ₯Ό κ²°μ νλ€. λν, νλ² μνμ΄ μ’ λ£λ μ°λ λλ λ€μ μ€νν μ μλ€!! μ¦, νλμ μ°λ λμ λν΄ start()κ° ν λ²λ§ νΈμΆλ μ μλ€λ λ»μ΄λ€.
start()μ run()
μ°λ λλ₯Ό μ€νμν¬ λ run()μ΄ μλ start() νΈμΆνλ€λ κ²μ΄ μλ¬Έμ΄ λ€ κ²μ΄λ€. μ°λ λκ° μ€νλλ κ³Όμ μ λν΄μ μ΄ν΄λ³΄μ.

- main λ©μλμμ μ°λ λμ start()λ₯Ό νΈμΆνλ€.
- start()λ μλ‘μ΄ μ°λ λλ₯Ό μμ±νκ³ , μ°λ λκ° μμ νλλ° μ¬μ©λ νΈμΆμ€νμ μμ±νλ€.
- μλ‘ μμ±λ νΈμΆμ€νμ run()μ΄ νΈμΆλμ΄, μ°λ λκ° λ 립λ 곡κ°μμ μμ μ μννλ€.
- μ΄μ λ νΈμΆμ€νμ΄ 2κ°μ΄λ―λ‘ μ€μΌμ€λ¬κ° μ ν μμμ μν΄μ λ²κ°μ κ°λ©΄μ μ€νλλ€.
- run()μ μνμ΄ μ’ λ£λ μ°λ λλ νΈμΆμ€νμ΄ λͺ¨λ λΉμμ§λ©΄μ μ΄ μ°λ λκ° μ¬μ©νλ νΈμΆμ€νμ μ¬λΌμ§λ€.
μ΄μ²λΌ mainλ©μλμμ run()μ νΈμΆνλ κ²μ μμ±λ μ°λ λλ₯Ό μ€νμν€λ κ²μ΄ μλλΌ λ¨μν ν΄λμ€μ μ μΈ λ λ©μλλ₯Ό νΈμΆνλ κ²μΌ λΏμ΄λ€. λν, λͺ¨λ μ°λ λλ λ 립μ μΈ μμ μ μννκΈ° μν΄ μμ λ§μ νΈμΆμ€νμ νμλ‘ νκΈ° λλ¬Έμ, μλ‘μ΄ μ°λ λλ₯Ό μμ±νκ³ μ€νμν¬ λλ§λ€ μλ‘μ΄ νΈμΆμ€νμ΄ μμ±λκ³ μ°λ λκ° μ’ λ£λλ©΄ μμ μ μ¬μ©λ νΈμΆμ€νμ μλ©Έλλ€.
κ·Έλ¦¬κ³ mainλ©μλμ μμ μ μννλ κ²λ μ°λ λμ΄λ©°, μ΄λ₯Ό mainμ°λ λλΌκ³ νλ€.
μ±κΈμ°λ λμ λ©ν°μ°λ λ
- μ±κΈμ°λ λ : νλμ μ°λ λλ‘ λ κ°μ μμ μ μννλ κ²½μ°

- λ©ν°μ°λ λ : λ κ°μ μ°λ λλ‘ λκ°μ μμ μ μννλ κ²½μ°, OS μ€μΌμ€λ¬κ° μ€νμμλ₯Ό κ²°μ νκΈ°μ μ€νν λλ§λ€ λ€λ₯΄κ² λνλλ€.

μ±κΈμ°λ λλ‘ νλ‘κ·Έλ¨μ μ€νν κ²κ³Ό λ©ν°μ°λ λλ‘ μ€νν κ²μ λΉκ΅ν΄λ³΄λ©΄ λ©ν°μ°λ λλ‘ μμ ν λ λ―ΈμΈνκ² λ λ§μ μκ°μ΄ κ±Έλ¦¬κ² λλ©° μ΄μ λ λ κ°μ§μ΄λ€. 첫 λ²μ§Έλ‘ λ μ°λ λκ° λ²κ°μκ°λ©΄μ μμ μ μ²λ¦¬νκΈ° λλ¬Έμ μ°λ λκ°μ μμ μ νμκ°μ΄ μμλκΈ° λλ¬Έμ΄κ³ , λ λ²μ§Έλ ν μ°λ λκ° νλ©΄μ μΆλ ₯νκ³ μλ λμ λ€λ₯Έ μ°λ λλ μΆλ ₯μ΄ λλκΈ°λ₯Ό κΈ°λ€λ €μΌνλλ°, μ΄λ λ°μνλ λκΈ°μκ° λλ¬Έμ΄λ€. νμ§λ§ μ μΆλ ₯κ³Ό κ°μ΄ λ μ°λ λκ° μλ‘ λ€λ₯Έ μμμ μ¬μ©νλ μμ μ κ²½μ°μλ μ±κΈμ°λ λ νλ‘μΈμ€λ³΄λ€ λ©ν° μ°λ λ νλ‘μΈμ€κ° λ ν¨μ¨μ μ΄λ€.
μ°λ λμ μ°μ μμ(priority of thread)
μ°λ λλ μμ μ μ€μλμ λ°λΌ μ°μ μμλ₯Ό λ€λ₯΄κ² νμ¬ νΉμ μ°λ λκ° λ λ§μ μμ μκ°μ κ°κ² ν μ μλ€.

μ°λ λ κ·Έλ£Ή
μ°λ λ κ·Έλ£Ήμ μλ‘ κ΄λ ¨λ μ°λ λλ₯Ό κ·Έλ£ΉμΌλ‘ λ¬Άμ΄μ λ€λ£¨κΈ° μν κ²μ΄λ€. λͺ¨λ μ°λ λλ λ°λμ νλμ μ°λ λ κ·Έλ£Ήμ ν¬ν¨λμ΄ μμ΄μΌνλλ° μ°λ λ κ·Έλ£Ήμ μ§μ νμ§ μκ³ μμ±ν μ°λ λλ 'mainμ°λ λ κ·Έλ£Ή'μ μνλ€. λν, μμ μ μμ±ν μ°λ λ(λΆλͺ¨ μ°λ λ)μ κ·Έλ£Ήκ³Ό μ°μ μμλ₯Ό μμλ°λλ€.
μ°λ λ κ·Έλ£Ήμ λ©μλλ€μ νμν λ μ°Ύμ보μ~
λ°λͺ¬ μ°λ λ(daemon thread)
μΌλ° μ°λ λ(non-daemon thread)μ μμ μ λλ 보쑰μ μΈ μν μ μννλ μ°λ λμ΄λ€. λ°λΌμ, μΌλ° μ°λ λκ° λͺ¨λ μ’ λ£λλ©΄ μλμ μΌλ‘ μ’ λ£λλ€. λ°λͺ¬ μ°λ λλ κ°λΉμ§ 컬λ ν°, μλμ μ₯, νλ©΄ μλκ°±μ λ±μ μ¬μ©λλ€.
λ°λͺ¬ μ°λ λλ 무ν루νμ 쑰건문μ μ΄μ©ν΄μ μ€ν ν λκΈ°νκ³ μλ€κ° νΉμ μ‘°κ±΄μ΄ λ§μ‘±λλ©΄ μμ μ μννκ³ λ€μ λκΈ°νλλ‘ μμ±νλ€.

μ°Έκ³ λ‘ setDaemon(boolean on)μ λ°λμ start() νΈμΆνκΈ° μ μ μ€νλμ΄μΌ νλ€. κ·Έλ μ§ μμΌλ©΄ IllegalThreadStateExceptionμ΄ λ°μνλ€.
μ°λ λμ μν


RUNNABLEμ μμ μ λ€ λ§μΉ λκΉμ§ μ€ννκ³ λ€μ λκΈ°νλ μΌμ’ μ μ€μκΈ° λ¨κ³λΌκ³ 보면 λλ€.
κ·Έλ¦¬κ³ μ°λ λμ μ€νμ μ΄ λ©μλλ₯Ό νμ©ν΄μ λ³΄λ€ ν¨μ¨μ μΈ νλ‘κ·Έλ¨μ μμ±ν μ μλ€.

sleep = μ μκΈ°
join = νΉμ μ°λ λ μμ νλ κ±° κΈ°λ€λ¦¬κΈ°
interrupt = κΉ¨μ°κΈ°
suspend = μΌμμ μ§
resume = μ¬κ°
stop = μμ μ μ§
yield = μ보νκΈ°
μ°λ λ λκΈ°ν(synchronization)
λ©ν° μ°λ λ νλ‘μΈμ€μμλ A μ°λ λκ° μμ μ λ€ λ§μΉμ§ λͺ»ν μνμμ B μ°λ λλ‘ μ°¨λ‘κ° λμ΄κ°μ λ μ§νκ³Όμ μμ κΈ°μ‘΄μ A μ°λ λμ μμ μ μν₯μ λ―ΈμΉ μ μλ€. μ΄μ²λΌ μ§νμ€μΈ μμ μ΄ λ€λ₯Έ μ°λ λμκ² κ°μλ°μ§ μκ² νλ €λ©΄ 'λκΈ°ν'κ° νμνλ€.
μ°λ λμ λκΈ°νλ ν μ°λ λκ° μ§νμ€μΈ μμ μ λ€λ₯Έ μ°λ λκ° κ°μνμ§ λͺ»νκ² λ§λ κ²μ λ§νλ€.
λκΈ°νλ₯Ό νλ €λ©΄ κ°μλ°μ§ μμμΌ νλ λ¬Έμ₯λ€μ 'μκ³ μμ'μΌλ‘ μ€μ νλ€. μκ³μμμ λ½(lock)μ μ»μ λ¨ νλμ μ°λ λλ§ μΆμ μ΄ κ°λ₯νλ€.(κ°μ²΄ 1κ°μ λ½ 1κ°)
- synchronizationλ₯Ό μ΄μ©ν λκΈ°ν
synchronizedλ‘ μκ³μμ(lockμ΄ κ±Έλ¦¬λ μμ)μ μ€μ νλ λ°©λ² 2κ°μ§

μκ³ μμμ ν μ°λ λλΉ ν κ°λ§ μ¬μ©ν μ μκΈ° λλ¬Έμ μμμ μ΅μν ν΄μΌνλ€. μκ³ μμμ λ©ν° μ°λ λ νλ‘κ·Έλ¨μ μ±λ₯μ μ’μ°νκΈ° λλ¬Έμ κ°λ₯νλ©΄ λ©μλ μ 체μ λ½μ κ±°λ 1λ²λ³΄λ€ 2λ² λ°©λ²μΌλ‘ μκ³ μμμ μ΅μνν΄μ λ³΄λ€ ν¨μ¨μ μΈ νλ‘κ·Έλ¨μ΄ λλλ‘ λ Έλ ₯ν΄μΌ νλ€.
wait()κ³Ό notify()
synchronizedλ‘ λκΈ°νν΄μ 곡μ λ°μ΄ν°λ₯Ό 보νΈνλ κ²μ μ’μλ° νΉμ μ°λ λκ° κ°μ²΄μ λ½μ κ°μ§ μνλ‘ μ€λ μκ°μ 보λ΄μ§ μλλ‘ νλ κ²λ μ€μνλ€. λκΈ°νλ₯Ό νκ² λλ©΄ λ€λ₯Έ μμ λ€μ΄ μνν μ§νλμ§ μκΈ° λλ¬Έμ΄λ€. λ°λΌμ, λκΈ°νμ ν¨μ¨μ λμ΄κΈ° μν΄ wait(), notify()λ₯Ό μ¬μ©νλ€. μ΄λ Objectν΄λμ€μ μ μλμ΄ μμΌλ©°, λκΈ°ν λΈλ‘ λ΄μμλ§ μ¬μ©ν μ μλ€.
wait = κΈ°λ€λ¦¬κΈ°, notify = waiting poolμμ λκΈ°μ€μΈ μ°λ λ μ€μ νλλ₯Ό κΉ¨μ°κΈ°, ν΅λ³΄, μλ €μ£ΌκΈ° , notifyAll = waiting poolμμ λκΈ°μ€μΈ λͺ¨λ μ°λ λλ₯Ό κΉ¨μ°κΈ°, ν΅λ³΄, μλ €μ£ΌκΈ°
κ·Έλ°λ° waitμ notifyμ κ²½μ° λκΈ°νκ³ μλ κ°μ²΄λ€μ΄ μ¬λ¬κ°μΌ λ νΈμΆλλ λμμ΄ λΆλΆλͺ νλ€.
μ΄μ²λΌ μμ μ μ°¨λ‘μΈλ°λ μνλ κ²μ΄ μκ±°λ λλ μ§λ νκ² μ΄μ΄ λλΉ ν μ°λ λκ° κ³μ ν΅μ§λ₯Ό λ°μ§ λͺ»νκ³ μ€λ«λμ κΈ°λ€λ¦¬κ² λλλ° μ΄κ²μ 'κΈ°μ(starvation) νμ'μ΄λΌκ³ νλ€. μ΄ νμμ λ§κΈ°μν΄ notifyAll()μ μ¬μ©ν΄μΌ νλ€. μ΄κ²μΌλ‘ κΈ°μνμμ λ§μμ§λ§ λΆνμνκ² λ§μ μ°λ λμ lockμ μ»κΈ° μν΄ κ²½μνκ² λλ€. μ΄λ₯Ό 'κ²½μ μν(race condition)'λΌκ³ νλ€. κ²½μ μνλ₯Ό κ°μ νκΈ° μν΄ μνλ μ°λ λλ₯Ό ꡬλ³ν΄μ ν΅μ§νλ κ²μ΄ νμνλ° μ΄λ Lockκ³Ό Conditionμ μ΄μ©νλ€.
Lockκ³Ό Conditionμ μ΄μ©ν λκΈ°ν
λκΈ°νν μ μλ λ°©λ²μ synchronizedλΈλ μΈμλ 'java.util.concurrent.locks'ν¨ν€μ§κ° μ 곡νλ lockν΄λμ€λ€μ μ΄μ©νλ λ°©λ²μ΄ μλ€. synchronizedλΈλμΌλ‘ λκΈ°νλ₯Ό νλ©΄ μλμ μΌλ‘ lockμ΄ μ κΈ°κ³ ν리기 λλ¬Έμ νΈλ¦¬νλ€. λΈλ λ΄μμ μμΈκ° λ°μν΄λ lockμ μλμ μΌλ‘ νλ¦°λ€. κ·Έλ¬λ λλ‘λ κ°μ λ©μλ λ΄μμλ§ lockμ κ±Έ μ μλ€λ μ μ½μ΄ λΆνΈνκΈ°λ νλ€. κ·Έλ΄ λ lockν΄λμ€λ₯Ό μ¬μ©νλ€. lockν΄λμ€λ€μ μλμΌλ‘ lockμ μ κ·Έκ³ ν΄μ ν΄μΌ νλ€. lockν΄λμ€μ μ’ λ₯λ λ€μκ³Ό κ°μ΄ 3κ°μ§κ° μλ€.
- ReentrantLock : μ¬μ§μ μ΄ κ°λ₯ν lock, κ°μ₯ μΌλ°μ μΈ λ°°ν lock
μ°λ¦¬κ° lockμ΄λΌκ³ λΆλ¬μλ κ²μΌλ‘ νΉμ 쑰건μμ lockμ νκ³ λμ€μ λ€μ lockμ μ»κ³ μκ³μμμΌλ‘ λ€μ΄μμ μ΄νμ μμ μ μνν μ μκΈ° λλ¬Έμ 'μ¬μ§μ ν μ μλ'μ΄λΌλ λ¨μ΄κ° λΆμ κ²μ΄λ€.
- ReentrantReadWriteLock : μ½κΈ°μλ 곡μ μ μ΄κ³ , μ°κΈ°μλ λ°°νμ μΈ lock
ReentrantLockμ λ€λ₯Έ κ²μ λ°°μ²νκ³ μκΈ°λ§μ μκ°νλ λ°°νμ μΈ lockμ΄λΌμ 무쑰건 lockμ΄ μμ΄μΌλ§ μκ³ μμμ μ½λλ₯Ό μνν μ μμ§λ§, ReentrantReadWriteLockλ μ½κΈ° lockμ΄ κ±Έλ €μμΌλ©΄, λ€λ₯Έ μ°λ λκ° μ½κΈ° lockμ μ€λ³΅ν΄μ κ±Έκ³ μ½κΈ°λ₯Ό μνν μ μλ€. μ½κΈ°λ λ΄μ©μ λ³κ²½νμ§ μκΈ°μ λμμ μ¬λ¬ μ°λ λκ° μ½μ΄λ λ¬Έμ κ° λμ§ μλλ€. κ·Έλ¬λ μ½κΈ° lockμ΄ κ±Έλ¦° μνμμ μ°κΈ° lockμ κ±°λ κ²μ νμ©λμ§ μλλ€.
- StampedLock : ReentrantReadWriteLockμ λκ΄μ μΈ lockμ κΈ°λ₯μ μΆκ°
lockμ κ±Έκ±°λ ν΄μ§ν λ 'μ€ν¬ν(longνμ μ μ μκ°)'λ₯Ό μ¬μ©νλ©°, μ½κΈ°μ μ°κΈ°λ₯Ό μν lockμΈμ 'λκ΄μ μ½κΈ° lock'μ΄ μΆκ°λ κ²μ΄λ€. μ½κΈ° lockμ΄ κ±Έλ €μμΌλ©΄, μ°κΈ° lockμ μ»κΈ° μν΄μλ μ½κΈ° lockμ΄ ν릴 λκΉμ§ κΈ°λ€λ €μΌνλλ° μ΄λ μ°κΈ° lockμ μν΄ λ°λ‘ νλ¦°λ€. κ·Έλμ λκ΄μ μ½κΈ°μ μ€ν¨νλ©΄, μ½κΈ° lockμ μ»μ΄μ λ€μ μ½μ΄ μμΌ νλ€. 무쑰건 μ½κΈ° lockμ κ±Έμ§ μκ³ , μ°κΈ°μ μ½κΈ°κ° μΆ©λν λλ§ μ°κΈ°κ° λλ νμ μ½κΈ° lockμ κ±°λ κ²μ΄λ€.
λ€μμ μ°λ λλ₯Ό ꡬλΆν΄μ ν΅μ§ν μ μλλ‘ νλ Conditionμ΄λ€. μνλ μ°λ λ νΈμΆμ μν Conditionμ κ°κ° λ§λ€μ΄μ waiting poolμμ λ°λ‘ κΈ°λ€λ¦¬λλ‘ νλ κ²μ΄λ€. ex) μλ¦¬μ¬ μ°λ λλ₯Ό μν Condition, μλ μ°λ λλ₯Ό μν Condition
μ΄λλ wait(), notify()λμ Conditionμ await()μ signal()μ μ¬μ©νλ€. μ΄λ‘μ¨, ν΅μ§μ λμμ΄ λͺ νν ꡬλΆν μ μκ² λλ€.
volatile
μμ¦μ λλΆλΆ λ©ν° μ½μ΄ νλ‘μΈμκ° μ₯μ°©λ μ»΄ν¨ν°λ₯Ό μ¬μ©νλ©° μ΄λ μ½μ΄λ§λ€ λ³λμ μΊμλ₯Ό κ°μ§κ³ μλ€. μ½μ΄λ λ©λͺ¨λ¦¬μμ μ½μ΄μ¨ κ°μ μΊμμ μ μ₯νκ³ μΊμμμ κ°μ μ½μ΄μ μμ νλ€. λ€μ κ°μ κ°μ μ½μ΄μ¬ λλ λ¨Όμ μΊμμ μλμ§ νμΈνκ³ μμ λλ§ λ©λͺ¨λ¦¬μμ μ½μ΄μ¨λ€. κ·Έλ¬λ€λ³΄λ λμ€μ λ©λͺ¨λ¦¬μ μ μ₯λ λ³μμ κ°μ΄ λ³κ²½λμλλ°λ μΊμμ μ μ₯λ κ°μ΄ κ°±μ λμ§ μμμ λ©λͺ¨λ¦¬μ μ μ₯λ κ°μ΄ λ€λ₯Έ κ²½μ°κ° λ°μνλ€. κ·Έλμ ν λ³μμ κ°μ΄ λ°λμλλ°λ μ°λ λκ° λ©μΆμ§ μκ³ κ³μ μ€νλμ΄ μνμ§ μλ μμ μ΄ μ§νλλ κ²μ΄λ€.
μ΄μ λ³μ μμ volatileμ λΆμ΄λ©΄, μ½μ΄κ° λ³μμ κ°μ μ½μ΄μ¬ λ μΊμκ° μλ λ©λͺ¨λ¦¬μμ μ½μ΄μ€κΈ° λλ¬Έμ μΊμμ λ©λͺ¨λ¦¬κ°μ κ°μ λΆμΌμΉκ° ν΄κ²°λλ€. λ³μμ volatileμ λΆμ΄λ λμ μ synchronizedλΈλμ μ¬μ©ν΄λ κ°μ ν¨κ³Όλ₯Ό μ»μ μ μλ€. μ°λ λκ° synchronizedλΈλμΌλ‘ λ€μ΄κ° λμ λμ¬ λ, μΊμμ λ©λͺ¨λ¦¬κ°μ λκΈ°νκ° μ΄λ£¨μ΄μ§κΈ° λλ¬Έμ΄λ€.
'Backendπ± > Java' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| λμμ± λ¬Έμ λ₯Ό ν΄κ²°νλ λ€μν λ°©λ² (feat. μλ°, DB Lock, Redisμ λΆμ°λ½) (0) | 2023.02.14 |
|---|---|
| [μλ°/Java] μ€νΈλ¦Ό(stream) (0) | 2023.01.08 |
| [μλ°/Java] μ§λ€λ¦μ€(Generics) (0) | 2023.01.04 |
| [μλ°/Java] Stringν΄λμ€ (0) | 2023.01.03 |
| [μλ°/Java] μμΈμ²λ¦¬(exception handling) (0) | 2023.01.02 |