λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
κΈ€μ“°λŠ” κΏ€λ²Œ 🐝

Dev Study #3 (feat. Design Pattern)

by soyλ―Έλ‹ˆ 2022. 2. 18.

 

 

[μžλ°” μ–Έμ–΄λ‘œ λ°°μš°λŠ” λ””μžμΈ νŒ¨ν„΄ μž…λ¬Έ] λ„μ„œλ₯Ό 읽고 κ³΅λΆ€ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.

 

 

 

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

λŒ“κΈ€