[μλ° μΈμ΄λ‘ λ°°μ°λ λμμΈ ν¨ν΄ μ λ¬Έ] λμλ₯Ό μ½κ³ 곡λΆν λ΄μ©μ λλ€.
Single Threaded Execution ν¨ν΄
νλμ μ°λ λλ§μ΄ μ²λ¦¬λ₯Ό μ€νν μ μλλ‘ μ νμ λ ν¨ν΄
(νλμ μ°λ λκ° μΈμ€ν΄μ€μ μνλ₯Ό λ³νμν€κ³ μλ λμ€μλ λ€λ₯Έ μ°λ λκ° μΈμ€ν΄μ€μ μ κ·Όνμ§ λͺ»νλλ‘ νλ ν¨ν΄)
λ°λλ½ (deadlock)
λ κ°μ μ°λ λκ° λ κ°μ λ½μ μ°¨μ§νμ¬ μλ‘ μλμ μ°λ λκ° λ½μ ν΄μ νλ κ²μ κΈ°λ€λ¦¬λ νμ
λ°λλ½μ μΌμΌν¨ μ°λ λλ μ΄λ»κ² ν΄λ μμ§μ΄μ§ μκ² λλ―λ‘ μμ‘΄μ±μ μλλ€.
λ°λλ½ μ‘°κ±΄
- 볡μμ SharedResource (곡μ μμ) μν μ νλ μΈμ€ν΄μ€κ° μμ λ
- μ°λ λκ° μ΄λ€ SharedResource μν μ λ½μ κ°μ§ μ± λ€λ₯Έ SharedResource μν μ λ½μ κ°μ§λ¬ κ° λ
- SharedResource μν μ λ½μ κ°λ μμκ° μ ν΄μ Έμμ§ μμ λ
synchronized μ ꡬ문과 before / after ν¨ν΄
void method(){
lock();
doMethod(); // μ¬κΈ°μ μμΈκ° λ°μνλ©΄ unlock() μ λΆλ €μ§μ§ μλλ€.
unlock();
}
// synchronized λ©μλλ λΈλ‘μ κ²½μ° return μ νκ±°λ μμΈκ° λ°μνλ©΄ νμ€ν λ½μ ν΄μ νλ€.
// lock() μ νΈμΆν ν unlock() μ νΈμΆνκ³ μΆμΌλ©΄ finally λ₯Ό μ¬μ©νλ€.
void method(){
lock();
try {
...
} finally {
unlock();
}
}
- try λ¬Έ μμμ return μ νκ±°λ μμΈκ° λ°μνλλΌλ finally λΆλΆμ΄ νΈμΆλλ€. (μλ° κ·μΉ)
- finally μ¬μ©μ before / after ν¨ν΄μ μ€ν λ°©λ² μ€ νλμ΄λ€.
Immutable (λΆλ³μ) ν¨ν΄
μΈμ€ν΄μ€μ μνκ° μ λλ‘ λ³νμ§ μλ ν΄λμ€κ° λ±μ₯
μμ μ±μ΄ 보μ₯λκΈ° λλ¬Έμ synchronized λ©μλλ₯Ό μ¬μ©ν΄μ μ°λ λλ₯Ό λ°°ν μ μ΄ν νμκ° μλ€.
κ·Έλ¬λ λΆλ³μ±μ 보μ¦νλ κ²μ μμΈλ‘ νλ€μ΄μ μ£Όμκ° νμνλ€.
Person ν΄λμ€
μ¬λμ λνλ΄λ ν΄λμ€, name κ³Ό address λ₯Ό νλλ‘ κ°μ§λ€.
public final class Person {
private final String name;
private final String address;
public Person(String name, String address){
this.name = name;
this.address = address;
}
public String getName(){
return name;
}
public String getAddress(){
return address;
}
public String toString(){
return "[ Person: name = " + name + ", address = " + address + " ]";
}
}
Main ν΄λμ€
Person ν΄λμ€μ μΈμ€ν΄μ€ ν κ°μ μΈ κ°μ μ°λ λκ° μ κ·Όνλ€. (λμ ν μ€νΈμ© ν΄λμ€)
public class Main {
public static void main(String[] args) {
Person alice = new Person("Alice", "Alaska");
new PrintPersonThread(alice).start();
new PrintPersonThread(alice).start();
new PrintPersonThread(alice).start();
}
}
PrintPersonThread ν΄λμ€
μμ±μμμ μ£Όμ΄μ§ Person ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμν νμνλ ν΄λμ€
public class PrintPersonThread extends Thread {
private Person person;
public PrintPersonThread(Person person) {
this.person = person;
}
public void run() {
while (true) {
System.out.println(Thread.currentThread().getName() + "prints " + person);
}
}
}

- { frozen } μ μ½ : μΈμ€ν΄μ€κ° λ§λ€μ΄μ Έ νλκ° μ΄κΈ°νλ λ€μ κ°μ΄ λ³κ²½λμ§ μλ κ²μ λνλ΄λ κ² (= final νλ)
- { concurrent } μ μ½ : 볡μμ μ°λ λκ° λμμ μ€ννκ³ μμ΄λ μκ΄ μλ€λ κ²μ λͺ μμ μΌλ‘ λνλ΄λ κ² (= synchronized λ©μλλ‘ ν νμκ° μλ€)
- μΈμ€ν΄μ€μ μνκ° κ²°μ½ λ³νμ§ μκΈ° λλ¬Έμ μΈμ€ν΄μ€λ₯Ό synchronized λ‘ μ§ν¬ νμκ° μλ€.
Immutable μν
Immutable μν μ β νλμ κ°μ λ³κ²½ν μ μκ³ β‘ νλμ λ΄μ©μ λ³κ²½νλ λ©μλ(setter) λ κ°μ§κ³ μμ§ μμ ν΄λμ€μ΄λ€.
Immutable μν μ μΈμ€ν΄μ€λ μμ±, μΌμ²΄μ μν λ³νλ₯Ό νμ§ μλλ€.
StringBuffer ν΄λμ€
String μ μΈμλ‘ κ°λ μμ±μκ° μλ€.
String ν΄λμ€
StringBuffer λ₯Ό μΈμλ‘ κ°λ μμ±μκ° μλ€.
μ¦, StringBuffer μ μΈμ€ν΄μ€μ String μ μΈμ€ν΄μ€λ μνΈ λ³ν κ°λ₯νλ€.
λ΄μ©μ μμ£Ό λ³κ²½νλ€. (=> StringBuffer)
λ΄μ© λ³κ²½ x μ°Έμ‘° o (=> String)
'κΈμ°λ κΏλ² π' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Dev Study #4 (feat. Design Pattern) (0) | 2022.02.21 |
---|---|
Dev Study #2 (feat. JAVA) (0) | 2022.02.18 |
Dev Study #1 (0) | 2022.02.16 |
[Book Review] μΈμμ μ€μ μ΄λ€ (0) | 2021.10.07 |
λκΈ