언어/자바

동시성(Concurrency)과 병렬성(Parallelism)

ballde 2021. 9. 8. 12:49

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