https://balldev.tistory.com/18
함수형 프로그래밍 & 람다 & 메소드 참조
함수형 프로그래밍 일단 함수형 프로그래밍의 등장 배경을 보겠습니다. 일단 명령형 프로그래밍 기반에서 소프트웨어의 크기가 커졌습니다. 그래서 스파게티 코드를 유지 보수할 수가 없어졌
balldev.tistory.com
이전에 쓴 글인 함수형 프로그래밍이 왜 유행하고 있는가에 대해 얘기해보겠습니다.
동시성과 병렬성
동시성
- 싱글 cpu가 동시에 여러 작업을 실행
- 하나의 cpu코어에서 멀티 스레드가 번갈아가며 실행
- '비동기 처리' 또한 동시성을 이용한 방법
병렬성
- 멀티 코어, 여러개의 cpu에서 개별 쓰레드가 동시에 실행
동시성과 병렬성 비교
- 일반적인 성능 → 동시성 > 병렬성
- 병렬성을 만족하면 동시성도 만족
- but 동시성을 만족한다고 병렬성을 만족하는 것은 아님
병렬성 처리와 함수형 프로그래밍과의 관계는?
이전에 함수형 프로그래밍에서 설명했다시피 전역변수를 참조해서 함수를 뽑을 수도 있다.
public class Main {
private static List<String> urlList = new ArrayList<>();
public static void main(String[] args) {
setShop("hello");
System.out.println(urlList);
setShop("my name");
System.out.println(urlList);
setShop("ball");
System.out.println(urlList);
}
public static List<String> setShop(String shopName) {
urlList.add(shopName);
return urlList;
}
}
--------------------------
[hello]
[hello, my name]
[hello, my name, ball]
같은 함수를 실행하더라도 가변데이터를 참조해서 같은 결과를 보장하지 않는다.
하지만 함수형 프로그래밍은 가변데이터를 참조하지 않아서
같은 결과를 얻는다. (순수함수)
즉 멀티 쓰레드 환경에서는 예상친 못한 문제가 발생할 수도 있다.
해결하려면?
락을 걸어주거나 synchronized 를 해주어
동기화를 해주어야한다.
락
스레드가 고유 잠금을 소유하는 한 다른 스레드는 동일한 잠금을 획득할 수 없고 다른 스레드는 잠금 획득을 시도할 때 차단됩니다. 차단된 스레드는 현재 실행 중인 스레드가 잠금을 해제할 때까지 대기합니다.
스레드 1이 해당 메모리를 사용 중이라면 다른 스레드는 A가 락을 해제할 때 까지 기다려야한다(블로킹) → 동시성이 떨어진다.
public class MultipleSyncMethodsDemo {
public static void main (String[] args) throws InterruptedException {
MultipleSyncMethodsDemo demo = new MultipleSyncMethodsDemo();
Thread thread1 = new Thread(() -> {
System.out.println("thread1 before call "+ LocalDateTime.now());
demo.syncMethod1("from thread1");
System.out.println("thread1 after call "+LocalDateTime.now());
});
Thread thread2 = new Thread(() -> {
System.out.println("thread2 before call "+LocalDateTime.now());
demo.syncMethod2("from thread2");
System.out.println("thread2 after call "+LocalDateTime.now());
});
thread1.start();
thread2.start();
}
// synchronized 가 있는 메소드에 접근할 때 잠그고 반환시 잠금 해제
private synchronized void syncMethod1 (String msg) {
System.out.println("in the syncMethod1 "+msg+" "+LocalDateTime.now());
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private synchronized void syncMethod2 (String msg) {
System.out.println("in the syncMethod2 "+msg+" "+LocalDateTime.now());
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
하지만 함수형 프로그래밍에서는 공유하는 가변데이터가 없기 때문에 영향을 받지 않는다.
즉 따로 동기화 처리를 하지 않아도 된다.
정리하자면
위처럼 이러한 특징들이 있다. 그래서 머신러닝, 데이터 분석 등 많은 시간이 소요되는 분야에서는 동시성 및 병렬성을 쉽게 할 수 있어 함수형 프로그래밍이 유행하고 있다.
'언어 > 자바' 카테고리의 다른 글
thread에 대해서! (0) | 2021.09.11 |
---|---|
자바 컬렉션(List, Map, Set) (0) | 2021.09.10 |
java의 스트림이란?? (0) | 2021.09.06 |
함수형 프로그래밍 & 람다 & 메소드 참조 (0) | 2021.09.05 |
JAVA - 추상클래스와 인터페이스 (0) | 2021.09.03 |