Skip to content

Latest commit

ย 

History

History
98 lines (78 loc) ยท 3.17 KB

File metadata and controls

98 lines (78 loc) ยท 3.17 KB

Syncronous vs Asyncronous

๋น„๋™๊ธฐ Asyncronous

๋น„๋™๊ธฐ๋ž€ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น์ด ์ข…๋ฃŒ๋˜์ง€ ์•Š์•„๋„ ๋‹ค์Œ ๋ช…๋ น์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
Callback ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (ex) Ajax, Thread

class User {
  private int userNo = 0;

  // ์ž„๊ณ„ ์˜์—ญ์ด ๋˜์–ด์•ผํ•˜๋Š” ๋ฉ”์†Œ๋“œ
  public void add(String name) {
    System.out.println(name + " : " + userNo++);
  }
}

class UserThread extends Thread {
  User user;

  UserThread(User user, String name) {
    super(name);
    this.user = user;
  }

  public void run() {
    try {
      for (int i = 0; i < 3; i++) {
        user.add(getName());
        sleep(500);
      }
    } catch(InterruptedException e) {
      System.err.println(e.getMessage());
    }
  }
}

public class SyncThread {
  public static void name(String[] args) {
    User user = new User();

    // 3๊ฐœ์˜ ์Šค๋ ˆ๋“œ ๊ฐ์ฒด ์ƒ์„ฑ
    UserThread p1 = new UserThread(user, "A");
    UserThread p2 = new UserThread(user, "B");
    UserThread p3 = new UserThread(user, "C");

    // ์Šค๋ ˆ๋“œ ์Šค์ผ€์ค„๋ง : ์šฐ์„ ์ˆœ์œ„ ๋ถ€์—ฌ
    p1.setPriority(p1.MAX_PRIORITY);
    p2.setPriority(p2.NORM_PRIORITY);
    p3.setPriority(p3.MIN_PRIORITY);

    p1.start();
    p2.start();
    p3.start();
  }
}
// ๊ฒฐ๊ณผ => ์ˆœ์„œ ๋’ค์ฃฝ๋ฐ•์ฃฝ
A : 0๋ฒˆ์งธ ์‚ฌ์šฉ
B : 1๋ฒˆ์งธ ์‚ฌ์šฉ
C : 2๋ฒˆ์งธ ์‚ฌ์šฉ
A : 3๋ฒˆ์งธ ์‚ฌ์šฉ
C : 5๋ฒˆ์งธ ์‚ฌ์šฉ
B : 4๋ฒˆ์งธ ์‚ฌ์šฉ
C : 7๋ฒˆ์งธ ์‚ฌ์šฉ
A : 6๋ฒˆ์งธ ์‚ฌ์šฉ
B : 8๋ฒˆ์งธ ์‚ฌ์šฉ

๋™๊ธฐ Syncronous

๋™๊ธฐ๋ž€ ํ•œ ์ž์›์— ๋™์‹œ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ์ œํ•œํ•˜์—ฌ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ์— ์‹คํ–‰๋  ๋ช…๋ น์€ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น ์ข…๋ฃŒ ์‹œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๊ณ  ๋Œ€๊ธฐ์‹œ๊ฐ„์ด ๋ฐœ์ƒํ•˜์—ฌ ๋ฒ„ํผ๋ง์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒƒ์ด ๋™์‹œ์— ์ด๋ฃจ์–ด์ง€๋Š” ํ˜•ํƒœ๋กœ, ํ˜„๊ธˆ ์ธ์ถœ๊ธฐ์™€ ๊ฐ™์ด ์‹œ๊ฐ„์ ์ธ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Java์—์„œ synchronized ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์ ‘๊ทผ ์ œํ•œ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

public synchronized void add(String name) {
    System.out.println(name + " : " + userNo++);
  }

๋ฉ”์†Œ๋“œ, ๋ธ”๋ก ๋‹จ์œ„๋กœ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ๋ฉ”์†Œ๋“œ ๋‹จ์œ„๋กœ ์ง€์ •ํ•  ๊ฒฝ์šฐ ๋ฉ”์†Œ๋“œ ์ „์ฒด์— lock์ด ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ž„๊ณ„ ์˜์—ญ์ด ๋„ˆ๋ฌด ์ปค์„œ ๊ฐ€๋Šฅํ•˜๋ฉด ๋ธ”๋ก ์˜์—ญ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก Synchronized Collection์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
List ๋Œ€์‹  Vector, Map ๋Œ€์‹  HashTable ๋“ฑ synchronized ํ‚ค์›Œ๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋œ Collection๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด Collection๋“ค์€ ์ œ๊ณตํ•˜๋Š” API๊ฐ€ ์ ๊ณ  ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ์—๋Š” Collections๋ผ๋Š” util ํด๋ž˜์Šค์—์„œ ์ œ๊ณต๋˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
synchronizedList(), synchronizedSet(), synchronizedMap() ๋“ฑ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

JDK 1.7 ๋ถ€ํ„ฐ concurrent package๋ฅผ ํ†ตํ•ด ConcurrentHashMap์ด๋ผ๋Š” ๊ตฌํ˜„์ฒด ๋˜ํ•œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์ด๋Š” Collections util ๋ณด๋‹ค synchronized ํ‚ค์›Œ๋“œ ์ ์šฉ ๋ฒ”์œ„๊ฐ€ ์ข์•„์„œ ๋ณด๋‹ค ์ข‹์€ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.