DeadLock(데드락)

 

DeadLock(데드락)이란?

  • 두 개 이상의 프로세스나 스레드가 서로 자원을 얻지 못해서 다음 처리를 하지 못하는 상태를 의미한다.
  • 무한히 다음 자원을 기다리게 되는 상태를 말한다.
  • 시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생한다.

ex)

프로세스1,2가 있고 자원3, 4를 모두 얻어야 한다고 가정해보자

 

t1 : 프로세스1이 자원3을 얻음 / 프로세스2가 자원4를 얻음

t2 : 프로세스1은 자원4를 기다림 / 프로세스2는 자원3을 기다림

 

현재 서로 원하는 자원이 상대방에 할당되어 있어서 두 프로세스는 무한정 wait 상태에 빠짐

 

데드락을 방지하기 위해서는

=> 싱크로나이즈는 블록을 적게 , 열쇠는 개별로 만들어 주는게 좋다.

 


 

Enum 타입

 

enumerated type의 줄임말로 열거형이라고 부르기도 하는데 요소, 멤버라 불리는 명명된 값의 집합을 이루는 자료형이다.

=> 반드시 어떤 행동을 한다음에 무엇이 실행되게 하기 위해서는 Enum타입으로 하면 좋다.

 

 

values()

- 열거된 모든 원소를 배열에 담아 순서대로 리턴한다.

Test1days[] test1days = Test1days.values();

이런식으로 활용하면 바로 배열에 담을 수 있다.

 

 

ordinal()

- 메소드는 해당 열거체 상수가 열거체 정의에서 정의된 순서(0부터 시작)를 반환한다.

단, 반환되는 값은 열거체 정의에서 해당 열거체 상수가 정의된 순서이며, 상숫값 자체가 아님을 명심해야한다.

 

 

원래 Enum 객체로 채운 배열에서 인덱스 번호로 값을 찍으면 필드에 선언된 값들이 찍혀야 한다.

여기서 필드에 선언된 값들이라하면 사진에 표시된 노란색 부분이다.

 

(단지 참고)

기본적인 Enum 클래스로 코딩할때 흐름

  1. Enum 클래스를 만든다.
  2. 추상 클래스(ElectricDevice)를 만든다.
  3. 추상클래스를 상속받는 클래스(Computer) 을 만든다.
  4. 마지막으로 ComputerTest 클래스를 만들어서 테스트 한다.

 


 

Thread의 실행 제어

 

yield()   

실행 중에 자신에게 주어진 실행시간을 다른 쓰래드에게 양보하고 자신은 실행 대기상태가 된다.

(내가 쓰는 Thread다른 사람에게 양보한다.)

 

 

join()

특정 쓰레드가 끝날때 까지 대기하고 그 Thread종료되면 현재 쓰레드 실행

join(1000)    =>1초간 기다리라는 의미

join()    => 해당 쓰래드가 완료될때 까지 main 쓰레드는  무한정 기다리겠다 라는 의미이다.

 

 

wait()

wait()를 통해 Thread정지상태로 만든다.

 

notify()

wait()상태의 Thread하나를 대기상태로 만든다.

 

notifyAll()

notifyAll() 메서드는 wait()에 의해 일시 정지된 모든 스레드들을 실행 대기 상태로 만든다.

단, 이 메서드들은 동기화 메서드 또는 동기화 블록에서만 실행 될 수 있다.

 

 

Thread의 상태

  상태 설명
객체 생성 NEW 스레드 객체가 생성. 아직 start() 메소드가 호출되지 않은 상태
실행 대기  RUNNABLE 실행 상태로 언제든지 갈 수 있는 상태 
일시 정지 WAITING 다른 스레드가 통지할 때까지 기다리는 상태
TIMED_WAITING  주어진 시간 동안 기다리는 상태 
BLOCKED  사용하고자 하는 객체의 락이 풀릴 때까지 기다리는 상태
종료  TERMINATED  실행을 마친 상태

 

 

562페이지 21번째줄 25번쨰줄 0.1초 지연준 코딩이다.

=> .start  라고 해서   바로 쓰래드가 new  에서 runnable로 넘어가는게 아니다.

어느정도 준비 시간이 조금 필요하다.(상태가 전환될때 어느정도 준비 시간이 필요하다.)

 

 

쓰래드끼리 주고 받으면서 출력하기 위해서는 notify를 사용해서서로 깨워주거나 하는 방식으로 번갈아 출력되게 해야한다. 이렇게 하지 않으면 한쪽이 한번에 쫙 출력된다.(p571)

 

Thread 사용처

 

Thread는 과연 어디서 필요할까?

웹개발 할때는 거의 사용하는 경우는 못봤다. 다만, 안드로이드 어플 개발 같은 걸할때 어플을 쓰면서 음악도 듣고 등등 여러가지 행위를 해야하므로 이때 사용되는게 Thread 이다.

 

 


Generics(제네릭)이란?

 

Generics(제네릭)이란 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크(compile-time type check)를 해주는 기능이다.

 

 

Generics(제네릭)을 만들었을까?

 

 

또다시 근본적인 질문을 해보자! 왜 만들어 졌을까 Generics(제네릭)은...?

(p588 참고)

 

근본 인스턴스는 Apple이라고 가정해 보자. 이걸 업캐스팅해서 Goods 클래스의 객체로 만들었다.

근데 이 객체를 Pencil 로 다운캐스팅 하려고 하면 가능할까?

=>불가능하다. => 왜냐하면 근본 인스턴스가 apple이기 때문이다.

이런 경우에는 castingException이 발생하는데 이런 상황에서는 동적으로 발생한 예외라서 이클립스상에 오류 부분이 발견되지도 않는다.

 

그래서 이런 상황을 방지하기 위해 Generics(제네릭)을 만들었다.

 

Generics을 쓰는 이유 정리

1. 컴파일시 최대한 오류를 줄여주기 위해서이다.
2. 코드의 안정성을 주기 위해서
3. 버그를 줄일라고 쓰는거다.

4. 컴파일시간에 버그를 최대한 잡아줘서 런타임시간에 버그를 줄여주는 것이다.

 


제네릭을 사용한다는 의미    =>      type Parameter 을 쓴다는것이다.

 

Generics(제네릭) 안에는 레퍼클래스(box primitives)로 사용해야 한다.

 

Generics(제네릭)의 장점

  1. 타입 안정성을 제공한다.
  2. 타입체크와 형변환을 생략할 수 있으므로 코드가 간결해 진다.

 

Generics(제네릭) 타입 매개변수들

 

보통 타입 매개변수명은 하나의 대문자입니다.

 

  • E - 요소(Element)
  • K - 키(Key)
  • N - 숫자(Number)
  • T - 타입(Type)
  • V - 값(Value)
  • S, U, V 등 - 2번째, 3번째, 4번째 타입

 

강한 타입체크로 에러를 미리 예방

 

Generics(제네릭) 메서드

 

 

메서드의 선언부에 지네릭 타입이 선언된 메서드를 지네릭 메서드라 한다.

이때, 타입 매개변수는 반환형 앞에 적어야 하며, 이를 반환형으로 사용할 수도 있다.

 

class GeneracPractice {
	public static <T> void printAnyThing(T[] arr1) {
		for (T t : arr1) {
			System.out.println(t);
		}
	}
	
	public static void main(String[] args) {
		Integer[] nums = {1, 2, 3 , 4, 5, 6};
		String[] names = {"전우치", "홍킬동", "우투리"};
		
		printAnyThing(nums);
		printAnyThing(names);
	}
}

 

제한된 Generics(제네릭) 클래스

 

 

타입 범위 제한

 

<> 안에서의 extends의 의미

=> Generics(제네릭) 처리를 하기 위한 최상위 클래스를 지정하는 것이다.

 

예를들어

<T extends Fruit> 는 Fruit 를 상속 받은 사과나 딸기 클래스 또는 Fruit 클래스를 사용하면 된다는 의미이다.

 

Generics(제네릭) 변수를 쓰면 매개 변수로 Object 메서드만 사용 가능 했다.

그래서 그걸 <T extends String> 같이 사용함으로써 String 만 쓸 수 있거나 특정 타입만 쓸수 있게 사용 할 수 있게 하였다.

 

 

Generics(제네릭)관련 정보

 

  • Generics(제네릭) 안 or 인터페이스에서도 extends 키워드 사용 가능하다.
  • super 클래스가 Generics(제네릭) 타입이면 sub 클래스도 Generics(제네릭) 타입이어야 한다.
  • 만약에 부모 클래스에서 타입을 하나만 받기로 했는데 자식에서 추가하고 싶을 경우에는 부모 클래스는 그대로 남겨두고 자식클래스에서 하나 더 추가해 주면된다.

 


Collection Framework

 

Collection Framework란?

동일한 타입을 묶어 관리하는 자료구조를 의미한다.

(배열이란 의미 자체는 비슷함, 다만 연속적 집합체는 아니다. 그런것도 있고 아닌것도 있다.)

 

의미가 비슷하다면 배열과 컬렉션의 차이점은 무엇일까?

Collection Framework은 저장 용량을 동적으로 관리한다.

 

Java에서 배열같은 경우는 저장 공간 크기를 확정해 줘야한다.

하지만 Collection Framework 같은 경우에는 저장 공간을 미리 확보할 수 있어서 늘렸다 줄였다가 할 수 있다.

( = 저장공간을 확보하는걸 동적으로 늘렸다가 줄였다를 할 수 있다.)

 

Collection Framework가 배열보다 속도는 느릴 수 밖에 없다.

 

 

참고) Collection Framework는...쫌 과한 느낌이다...Collection 라이브러리가 오히려 더 나은 표현 같기도 하다.

라이브러리 : 연관된 클래스와 인터페이스들의 묶음

 

 

Collection Framework의
핵심 인터페이스

 

인터페이스 특징
List 순서가 있는 데이터의 집합, 데이터의 중복을 허용
예) 대기자 명단
구현클래스 : ArrayList, LinkedList, Stack, Vector 등
Set 순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다.
예) 소수의 집합, 양의 정수집합
구현클래스 : HashSet, TreeSet 등
Map 키(key)와 값(value)의 쌍(pair)으로 이루어진 데이터의 집합
순서는 유지되지 않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용한다.
예) 우편번호, 지역번호(전화번호)
구현클래스 : HashMap.TreeMap, Hashtable, Properties 등

 

  • ArrayList<E> :  붙어있는 상태로 검색할 때 사용
  • vector<E>  : 동시에 여러명이 구조를 바꿀 경우 사용
  • LinkedList<E> : 내용이 변경될때나 데이터가 중간에 들어갈때 사용

 

ArrayList or vector에서 capacity를 사용해서 미리 배정된 공간을 확인할 수 있다.

(capacity 10으로 기본이 만들어짐)

 

LinkedList는 capacity를 지정 불가하다.

<E> element 가 들어갈때 그때 공간을 확보하는것이기 때문에 미리 capacity지정이 불가하다.

 

 

Arrays.asList()

 

Arrays.asList()  를 사용해서 정적 컬렉션객체를 바로 생성이 가능하다.

(단, Arrays.asList(1,2,3,4) 로 만들면 정적으로 [1 2 3 4 ] 배열을 만든것이기 때문에

데이터의 추가(add()) 및 삭제(remove())가 불가능 하다.

하지만 alist.set(1,7)은 하나의 값만 바꾸는 것이기 때문에 가능하다.)

 

 


오늘의 생각

 

p546 예제 바꾸기

thread8 의 Account를 살펴보기, key값에 따른 동시 사용 여부

p548

22번째 줄 String str2 = gm.

p609

method(Goods<A> v)

복사했습니다!