synchronized

  • λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ, 2~3개의 μŠ€λ ˆλ“œμ—μ„œ mutable shared dataλ₯Ό λ™μ‹œμ— μ—…λ°μ΄νŠΈ ν•  λ•Œ race condition λ°œμƒ.

    • 이 λ•Œ μžλ°”κ°€ μ œκ³΅ν•˜κ³  μžˆλŠ”, [[race-condition]] 을 ν”Όν•˜κΈ° μœ„ν•œ λ©”μΉ΄λ‹ˆμ¦˜μž„.

    • shard data에 μ ‘κ·Όν•˜λŠ” μŠ€λ ˆλ“€μ„ sychronizing ν•¨μœΌλ‘œ..

public class BaeldungSynchronizedMethods {

    private int sum = 0;

    public void calculate() {
        setSum(getSum() + 1);
    }

    // standard setters and getters
}

@Test
public void givenMultiThread_whenNonSyncMethod() {
    ExecutorService service = Executors.newFixedThreadPool(3);
    BaeldungSynchronizedMethods summation = new BaeldungSynchronizedMethods();

    IntStream.range(0, 1000)
      .forEach(count -> service.submit(summation::calculate));
    service.awaitTermination(1000, TimeUnit.MILLISECONDS);

    assertEquals(1000, summation.getSum());
}
  • int sum은 κ³΅μœ μžμ›, μ ‘κ·Όν•˜λŠ” 방식은 cacluate() λ₯Ό ν†΅ν•΄μ„œ (μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€..)

  • 즉 3개의 μŠ€λ ˆλ“œμ—μ„œ λ™μ‹œμ— μ ‘κ·Όν•΄μ„œ calculate() μ‹€ν–‰

  • κ²°κ³Όκ°€ 1000이 λ‚˜μ˜¬ 것이 κΈ°λŒ€λ˜μ§€λ§Œ, ν…ŒμŠ€νŠΈ μ‹€νŒ¨ν•¨.

keyword

  • [[synchronized]] ν‚€μ›Œλ“œλŠ” 3κ°€μ§€ 뢀뢄에 μ‚¬μš©ν•  수 있음.

    • instance method

    • static method

    • code blocks

  • code block에 μ‚¬μš©ν•  λ•ŒλŠ”, monitor 을 μ‚¬μš©ν•΄μ„œ 락을 제곡.

instance method

public synchronized void synchronisedCalculate() {
    setSum(getSum() + 1);
}
  • 일반적인 λ©”μ„œλ“œμ— ν‚€μ›Œλ“œ μΆ”κ°€ν•˜λŠ” 것.

  • μƒμ„±λœ instance ν•΄λ‹Ή λ©”μ„œλ“œμ— μ ‘κ·Όν•˜λŠ” 건 ν•œλ²ˆμ— ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œμ—μ„œλ§Œ κ°€λŠ₯ν•˜κ²Œν•¨.

  • μ—¬λŸ¬ instanceκ°€ μƒμ„±λ˜μ–΄ 있으면, 각각 μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ 각각 μŠ€λ ˆλ“œκ°€ ν•΄λ‹Ή λ©”μ„œλ“œμ— μ ‘κ·Ό κ°€λŠ₯ν•˜κ²Œ 됨.

static method

 public static synchronized void syncStaticCalculate() {
     staticSum = staticSum + 1;
 }
  • static ν‚€μ›Œλ“œμ™€ ν•¨κ»˜ μ‚¬μš©.

  • Class λ ˆλ²¨μ— μ’…μ†λ˜μ–΄μžˆμŒ.

    • 즉 였직 ν•˜λ‚˜μ˜ Class objectκ°€ [[JVM]] 에 μ‘΄μž¬ν•  수 μžˆλŠ” 만큼, 이 클래슀둜 μƒμ„±λœ μΈμŠ€ν„΄μŠ€κ°€ μ—¬λŸ¬κ°œ μžˆλ”λΌλ„, ν•΄λ‹Ή λ©”μ„œλ“œμ— μ ‘κ·Όν•˜λŠ” 건 ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ§Œ κ°€λŠ₯함.

  • μ •λ¦¬ν•΄λ³΄μžλ©΄ instance method λ ˆλ²¨μ— ν‚€μ›Œλ“œκ°€ λΆ™μ–΄μžˆμœΌλ©΄, ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€ μ—μ„œλ§Œ ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œκ°€ μ ‘κ·Όκ°€λŠ₯ν•˜λ„λ‘ 보μž₯ν•˜λŠ”λ°,

  • static 와 같이 μ‚¬μš©ν•œλ‹€λ©΄, ν•΄λ‹Ή ν΄λž˜μŠ€μ— ν•΄λ‹Ή λ©”μ„œλ“œμ— ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œκ°€ μ ‘κ·Όν•˜λ„λ‘ 보μž₯ν•˜λŠ” 것.

μ°Έκ³ 

Last updated

Was this helpful?