Language 36

12.4 쓰레드(Thread) - Lock과 Condition을 이용한 동기화

Lock과 Condition을 이용한 동기화 synchronized를 사용하면 자동으로 lock이 잠기고 풀리는 편리함이 있지만 때로는 같은 메서드 내에서만 lock을 걸수 있다는 제약이 불편하기도 하다. 그럴땐 lock클래스를 사용한다. ReentrantLock 특정 조건에서 lock을 풀고 나중에 다시 lock을 얻고 임계영역으로 들어와서 이후의 작업을 수행할 수 있다. 배타적인 lock으로, 무조건 lock이 있어야만 임계영역의 코드를 수행할 수 있다. 매개변수에 true를 주면 lock이 풀렸을때 가장 오래 기다린 쓰레드가 lock을 획득할 수 있게 처리한다. (그러나 이렇게 처리하려면 어떤 쓰레드가 가장 오래 기다렸는지 확인해야 되기때문에 성능이 떨어진다) ReentrantReadWriteLoc..

Language/Java 2021.07.29

12.3 쓰레드(Thread) - Synchronized를 이용한 동기화

멀티쓰레드 프로세스의 경우 여러 쓰레드가 같은 프로세스 내의 자원을 공유해서 작업하기 때문에, 서로의 작업에 영향을 주게된다. 이러한 점에서 멀티쓰레드로 작업을 했을때 원래 의도했던 것과는 다른 결과를 얻을 수가 있는데, 이러한 일의 발생을 방지하기 위해서 한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드에 의해 방해받지 않도록 하는 것이 필요하다. 이것이 바로 '임계 영역(critical section)'과 '잠금(lock)'이다. 공유 데이터를 사용하는 코드 영역을 임계 영역으로 지정해놓고, 공유 데이터(객체)가 가지고 있는 lock을 획득한 단 하나의 쓰레드만 이 영역 내의 코드를 수행할 수 있게 한다. 그리고 해당 쓰레드가 임계 영역 내의 모든 코드를 수행하고 벗어나서 lock을 반납해야만 다..

Language/Java 2021.07.29

12.2 쓰레드(Thread) - 실행 제어

효율적인 멀티쓰레드 프로그램을 만들기 위해서는 정교한 스케줄링을 통해 프로세스에게 주어진 자원과 시간을 여러 쓰레드가 낭비없이 잘 사용하도록 프로그래밍 해야한다. 스케줄링을 잘하기 위해서는 쓰레드의 상태와 관련 메서드를 잘 알아야 한다. static void sleep(long millis) static void sleep(long millis, int nanos) 지정된 시간동안 쓰레드를 일시정지 시킨다. 지정한 시간이 지나면 자동적으로 다시 실행 대기상태가 된다 void join() void join(long millis) void join(long millis, int nanos) 지정된 시간동안 쓰레드가 실행되도록 한다. 지정된 시간이 지나거나 작업이 종료되면 join()을 호출한 쓰레드로 다시 ..

Language/Java 2021.07.28

12.1 쓰레드 (Thread) - 구현

쓰레드를 구현하는 방법 1. Thread 클래스 상속 * 다른 클래스를 상속 받을수가 없어서 일반적으로 Runnable 인터페이스를 구현하는 방법을 쓴다. Class MyThread extends Thread{ public void run() { ... }// Thread클래스의 run() 오버라이딩 } Class Main{ public static void main(String[] args){ MyThread t1 = new MyThread();// Thread의 자손 클래스의 인스턴스 생성 t1.start();// 쓰레드 실행 } } Thread클래스르 상속받으면, 자손 클래스에서 조상인 Thread클래스의 메서드를 직접 호출할 수 있다. 2. Runnable 인터페이스 구현 Class MyThrea..

Language/Java 2021.07.28

11. 어노테이션(annotation)

소스코드에 대한 문서를 따로 만들기보다는 소스코드와 문서를 하나의 파일로 관리하는 방법으로 주석에 소스코드에 대한 정보를 저장하고, 해당 주석으로부터 HTML문서를 생성해내는 프로그램(javadoc.exe)을 만들어서 사용할 수 있다. 이 기능을 응용하여 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것이 어노테이션이다. 어노테이션은 주석처럼 프로그래밍 언어에 영향을 미치지 않으면서도 다른 프로그램에게 유용한 정보를 제공할 수 있다는 장점이 있다. * annotation의 뜻은 주석, 주해, 메모이다. 표준 어노테이션 @Override 컴파일러에게 오버라이딩하는 메서드라는 것을 알린다 @Deprecated 앞으로 사용하지 않을 것을 권장하는 대성에 붙인다 @Suppr..

Language/Java 2021.07.26

9. 제네릭스(gernerics)

내부에서 사용할 데이터 타입을 외부에서 지정하는 기법. 컴파일 시의 타입 체크를 해주는 기능으로, 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄인다. 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해진다. * 타입의 안정성을 높인다: 의도하지 않은 타입의 객체가 저장되는 것을 막고, 저장된 객체를 꺼내올때 원래 타입과 다르게 형변환되는 오류를 줄여준다. Class Box{ Object item; void setItem(Object item){ this.item = item }; Object getItem() { return item; } } 위의 Box 클래스를 제네릭 클래스로 변경해 보면, class Box{// 지네릭 타입 T를 선언 T item; void setItem(T item) { t..

Language/Java 2021.07.26

8.4 Collection Framework - Map 인터페이스

HashMap 키(key)와 값(value)를 묶어서 하나의 데이터(entry)로 저장한다. 해싱(hashing)을 사용하여 많은 데이터를 검색하는데 뛰어난 성능을 보인다. class Entry{ Object key; Object value; } * key: 컬렉션 내의 키들 중에서 유일해야함 (hashmap에서 키로 검색했을때 결과가 단 하나여야함) * value: 데이터 중복을 허용함 한정된 범위 내에 있는 순차적인 값들의 빈도수는 배열을 이용하지만, 한정되지 않은 범위늬 비순차적인 값들의 빈도수는 HashMap을 이용해서 구할 수 있다. HashMap() HashMap객체를 생성 HashMap(int capacity) 지정된 값을 초기용량으로 하는 HashMap 객체 생성 HashMap(int ca..

Language/Java 2021.07.24

8.3 Collection Framework - set 인터페이스

Set 인터페이스 중복을 허용하지 않고 저장순서가 유지되지 않는 컬렉션 클래스를 구현하는데 사용 HashSet Set인터페이스를 구현한 가장 대표적인 컬렉션. 중복된 요소를 저장하지 않는다 새로운 요소를 추가할 때는 add()나 addAll()을 사용하는데, 만일 중복된 요소를 추가하고자 한다면 false값이 반환되어 실패했다는 것을 알리게된다. 저장순서를 유지하지 않으므로 만약 저장순서를 유지하고자 한다면 LinkedHashSet을 사용해야 한다 HashSet() HashSet객체를 생성 HashSet(Collection c) 주어진 컬렉션을 포함하는 HashSet객체 생성 HashSet(int capacity) 주어진 값을 초기 용량으로 하는 HashSet객체 생성 HashSet(int capacit..

Language/Java 2021.07.20

8.2 Collection Framework - Queue 인터페이스

Queue 처음에 저장한 데이터를 가장 먼저 꺼내는 FIFO(First In First Out)구조로 되어있다. boolean add(Object o) 지정된 객체를 Queue에 추가 Object remove() Queue에서 객체를 꺼내 반환 Object element() 삭제없이 요소를 읽어온다 (peek()와 달리 Queue가 비었을때 예외 발생) boolean offer(Object o) Queue에 객체를 저장 Object poll() Queue에서 객체를 꺼내 반환 Object peek() 삭제없이 요소를 읽어옴 import java.util.*; public class Main { public static void main(String[] args) throws IOException { Qu..

Language/Java 2021.07.20

8.1 Collection Framework - List 인터페이스

컬렉션 프레임워크 (Collection Framework) 데이터 군을 저장하는 클래스들을 표준화한 설계 다수의 데이터를 다루는 데 필요한 다양하고 풍부한 클래스를 제공함 컬렉션 프레임워크의 모든 컬렉션 클래스들은 List, Set, Map 중의 하나를 구현하고 있으며, 구현한 인터페이스의 이름이 클래스의 이름에 포함되어있어서 이름만으로도 클래스의 특징을 쉽게 알 수 있도록 되어있다. * vector와 Hashtable은 컬렉션 프레임이 만들어지기 이전부터 존재하기 때문에 컬렉션 프레임워크의 명명법을 따르지 않는다. (가능하면 사용하지 않는게 좋음) List 인터페이스 중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현하는데 사용 1. ArrayList 컬렉션 프레임워크에서 가장 많이 사용되는 클래스 데..

Language/Java 2021.07.20
728x90