π μ μ©ν μ 보
eclipse μμ μ½λ κ³μΈ΅ ꡬ쑰 보기
f3
ν΄λΉ νκ²μΌλ‘ κ°κΈ° βμ°ν΄λ¦
βOpen Call Hierarchy
π‘νΌλλ°± Tip
ν¨μν νλ‘κ·Έλλ°μ μ₯μ
if
, for
λ¬Έ κ°λ°μκ° μ€μν μ μλ μμλ€μ΄ λ§μλ€.
(μΆκ°μ μΈ λ³μ μ¬μ©, 쑰건, λΆκΈ° μ μ΄ λ±)
Streamμ μ¬μ©ν ν¨μν νλ‘κ·Έλλ°μ μΆκ°μ μΈ λ³μλ₯Ό μ¬μ©νμ§ μμλ μ²λ¦¬κ° λλ€.
λ°λΌμ, κ°λ°μμ μ€μλ₯Ό μ€μΌ μ μλ€.Lambdaμ μΆμ½
Lambda μ
μ μ¬μ©ν λ μΆμ½μ΄ κ°λ₯ν λμλ νμ
λ±μ λͺ
μν΄λλ κ²μ΄ μ’λ€.μννΈμ¨μ΄ ν μ€νΈμ μ£Όμ μ κ·Ό λ°©μ
1. νμ΄νΈ λ°μ€ ν μ€νΈ
π μμ©Ch10μ ν΄λμ€ JUnit λ¨μ ν μ€νΈλ νμ΄νΈ λ°μ€ ν μ€νΈλΌ λ³Ό μ μλ€.
2. λΈλ λ°μ€ ν μ€νΈ
π νλ‘κ·Έλ¨ λ°μμ μ μΆλ ₯ λ§μ κ²μ¬νλ€.
컀λ²λ¦¬μ§
ν μ€νΈ μΌμ΄μ€κ° μ€νλ νμ μΌλ§λ λ§μ μ½λκ° μ€νλμλμ§λ₯Ό κ³μ°νμ¬ λνλΈλ€. ex) 100μ€μ μ½λ μ€ 80μ€μ΄ μ€νλμλ€λ©΄, μ½λ 컀λ²λ¦¬μ§λ 80%μ΄λ€.

BankTest
λ 82%μ 컀λ²λ¦¬μ§λ₯Ό 보μλ€.
π μμ© 11μ₯ μ€λ λ(Thread)λ₯Ό μ¬μ©ν λ³λ ¬ μ²λ¦¬
μ€λ λ (Thread)
- μ€λ λ(Thread) : νλ‘μΈμ€ λ΄μμ μ€νλλ νλ¦μ λ¨μ
κΈ°μ‘΄μ μ€λ λλ₯Ό μ¬μ©νμ§ μμ μΆλ ₯ μ
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
μ€λ λλ₯Ό μ¬μ©νλ μ
package com.pkd.example;
public class PrintingThread implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
}
package com.pkd.example;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println("μ무거λ μ
λ ₯");
Scanner sc = new Scanner(System.in);
Thread thread = new Thread(new PrintingThread());
thread.start();
sc.nextLine();
}
}
package com.pkd.example;
public class Main {
public static void main(String[] args) {
// Runnable ꡬνν ν΄λμ€λ₯Ό μΈμλ‘ μ£Όμ΄ μ€λ λ μ¬μ©
Thread thread = new Thread(new PrintingThread());
thread.start();
// 무λͺ
ν΄λμ€λ₯Ό νμ©ν μ€λ λ ꡬν
new Thread(new Runnable() {
@Override
public void run() {}
}).start();
// λλ€μμ μ΄μ©ν μ€λ λ ꡬν
new Thread(() -> {
}).start();
Ctrl
+ 1
: Convert to lambda expression
- ꡬνλ λλ€μ β Ctrl
+ 1
: Convert to lambda Class
μ€λ λ νμΈν΄λ³΄κΈ°
package com.pkd.example;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
new Thread(() -> {
for (int i = 0; i < 5; i++)
try {
Thread.sleep(100);
System.out.println("Thread :" + Thread.currentThread().getName() + " " + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
for (int i = 0; i < 5; i++)
try {
Thread.sleep(100);
System.out.println("Thread :" + Thread.currentThread().getName() + " " + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}

μ€λ λ μΈμ΄νν μ€κ³
μμλλ‘ μ€νλλ κ²μ λκΈ°(Synchronization) μ΄λΌκ³ νκ³ μ¬λ¬ μ€λ λκ° λμμ λ³λ ¬λ‘ μ€νλλ κ²μ λΉλκΈ°(Asynchronization) μ΄λΌκ³ νλ€ .
Javaμλ μ¬λ¬ μ€λ λλ₯Ό μ μ΄νλ λ°©λ²μ μ 곡νκ³ βμ¬λ¬ μ€λ λμμ λμμ μ΄μ©ν΄λ μμ ν ν΄λμ€λ λ©μλ'λ μ€λ λ μΈμ΄ν (Thread safe)ν μ€κ³λΌκ³ λ§ν μ μλ€.
1000κ°μ μ€λ λμ κ²½ν© μ‘°κ±΄(race condition) λ¬Έμ λ°μ
package com.pkd.example;
public class Counter {
int num = 0;
public static void main(String[] args) throws Exception {
Counter counter = new Counter();
// 1. λκΈ°νλ₯Ό νμ§ μμμ κ²½μ°.
for (int i = 0; i < 1000; i++) {
new Thread(() -> {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
counter.num++; // μ€λ λ λ΄μμ λ€λ₯Έ κ°μ²΄λ₯Ό μ‘°μνλ©΄
}).start();
}
Thread.sleep(2000);
System.out.println(counter.num);
}
}

μ΄λ, 10λ°λ¦¬μ΄ λλ μ΄κ° λͺ¨λ μ€λ λμ λν΄ μΆ©λΆνμ§ μμ μ μλ€. λ°λΌμ, μ€λ λλ€μ΄ num λ³μλ₯Ό λμμ μ¦κ°μν€λ κ²μ΄ κ°λ₯νλ©°, μ΄λ‘ μΈν΄ κ²½ν© μ‘°κ±΄(Race Condition) λ¬Έμ κ° λ°μνλ€. λ³μ κ°μ΄ μμ°¨μ μΌλ‘ μ μ μ¦κ° λμ§ μμμμλ, κ° μ€λ λκ° λμμ λ³μμ μ κ·Όνκ² λμ΄ μνλ κ°μ΄ μ μ₯λμ§ μμ λ¬Έμ κ° λ°μν κ²μ΄λ€.
Synchronizedμ μν λκΈ°ν μ μ΄
package com.pkd.example;
public class Counter {
int num = 0;
public static void main(String[] args) throws Exception {
// 2. λκΈ°ν νμ κ²½μ°
Counter counter2 = new Counter();
for (int i = 0; i < 1000; i++) {
new Thread(() -> {
try {
Thread.sleep(10);
synchronized (counter2) {
counter2.num++; // μ€λ λ λ΄μμ λ€λ₯Έ κ°μ²΄λ₯Ό μ‘°μνλ©΄
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
Thread.sleep(2000);
System.out.println(counter2.num);
}
}

synchronized
ν€μλλ₯Ό νμ©ν΄ λμμ±μ 보μ₯νκ² λμ΄ κ²½ν© μ‘°κ±΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμλ€.
λ°λΌμ, 볡μμ μ€λ λκ° μ€νν μ μλ κ°λ₯μ±μ΄ μλ λΆλΆμ synchronized
λΈλ‘ λ΄μ μμ±νλ©΄ λλ€.
μ€λ λ μ¬μ©μ μμ΄μμ μνμ± (κ΅μ°©μν)

κ΅μ°©μν (DeadLock) μμ

synchronized
λ‘ μΈν΄ resource1μ λν lock
β resource1μ΄ κ°μ©ν μ μλ μνλΌλ©΄ ν΄λΉ resource1λ₯Ό μ μ νκ³ , λ€λ₯Έ μ€λ λκ° resource1μ λν΄ μ κ·Όνμ§ λͺ»νλλ‘ lockμ 건λ€.
thread2
synchronized
λ‘ μΈν΄ resource2μ λν lock
β resource2μ΄ κ°μ©ν μ μλ μνλΌλ©΄ ν΄λΉ resource2λ₯Ό μ μ νκ³ , λ€λ₯Έ μ€λ λκ° resource2μ λν΄ μ κ·Όνμ§ λͺ»νλλ‘ lockμ 건λ€.
thread1
β resource2μ λν΄ μ μ νμ§ λͺ»ν΄ 무νμ λκΈ°
thread2
β resource1μ λν΄ μ μ νμ§ λͺ»ν΄ 무νμ λκΈ°
μ€λ λ μ¬μ©μ κ³ λ €ν μ
μ΄μ© μ μλ κ²½μ°μλ§ μ€λ λλ₯Ό μ¬μ©νκ³ , 리μ€ν¬λ₯Ό κ°μν κ°μ€λ₯Ό νκ³ , κ°λ°κΈ°κ°μ΄λ ν μ€νΈμ μΆ©λΆν μκ°μ κ°μ§λ€.
ν μ€νΈλ λ¬Έμ ν΄κ²°μ΄ 무μ§νκ² μ΄λ ΅λ€. κ°λ° 곡μ μ 체μ λ§μ μν₯μ λΌμΉ μ μλ€.
μ€λ λ λ± λ³λ ¬μ²λ¦¬(λΉλκΈ°)λ κ³ λμ μ€ν¬μ΄ νμνλ€.
Concurrency Utilitiesμ μ΄μ©
Executor Threadλ₯Ό μ§μ μ¬μ©νμ§ μκ³ λ³λ ¬ μ²λ¦¬κ° κ°λ₯ μ²λ¦¬ ν¨μ¨μ λμΌ μ μλ μ€λ λν(thread pool) λ±μ μ΄μ© κ°λ₯
μ€λ λ μΈμ΄νν 컬λ μ ConcurrentHashMap λ± κΈ°μ‘΄κ³Ό λμΌν κΈ°λ₯ + μ€λ λ μΈμ΄νν ν΄λμ€λ₯Ό μ 곡
Synchronized λλ Lock μ κ΄ν μν 볡μ μ€λ λλ₯Ό μ μ¬μ©νκΈ° μν κΈ°λ₯μ μ 곡νλ ν΄λμ€λ€ λ€μ μ 곡 CountDownLatch, CyclicBarrier, Exchanger, Semaphore λ±
πμ°μ΅ λ¬Έμ
11-1

package com.pkd.exam;
public class CountUpThread {
public CountUpThread() {
for (int i = 0; i <= 50; i++) {
System.out.print(i + " ");
}
System.out.println();
}
}
package com.pkd.exam;
public class Main {
public static void main(String[] args) {
for(int i = 0; i < 3; i++) {
new Thread(() -> {
CountUpThread cut = new CountUpThread();
}).start();
}
}
}

11-2

package com.pkd.exam;
public class Counter {
private long count = 0;
public synchronized void add(long i) {
System.out.println("λνκΈ°");
count += i;
}
public synchronized void mul(long i) {
System.out.println("κ³±νκΈ°");
count *= i;
}
public long getCount() {
return count;
}
public void setCount(long count) {
this.count = count;
}
}
package com.pkd.exam;
public class Main {
public static void main(String[] args) throws InterruptedException {
Counter counter = new Counter();
for (int i = 0; i < 3; i++) {
new Thread(() -> {
counter.add(1);
counter.add(1);
counter.mul(2);
counter.mul(2);
}).start();
}
Thread.sleep(10);
System.out.println(counter.getCount());
}
}

synchronized
ν€μλλ₯Ό κ° λ©μλμ μΆκ°νμ¬ λ©ν° μ€λ λ νκ²½μμλ μμ νλλ‘ μ€μ νλ€.
μ μμ μΈ κ³μ° κ²°κ³Όκ° μΆλ ₯λ κ²μ λ³Ό μ μμλ€.
Uploaded by N2T