본문 바로가기

자바의 정석 정리

자바의 정석 - 15.2 바이트기반 스트림 15.2.1 InputStream과 OutputStream InputStream의 메서드 Output의 메서드 더보기
자바의 정석 - 15.1 입출력 및 스트림 15.1.1 입출력 컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고받는 것 15.1.2 스트림 데이터를 운반하는데 사용되는 연결통로 단방향(I/O를 위해서는 두 개의 스트림 필요) FIFO(First In First Out)구조로 연속적인 데이터를 주고 받음 15.1.3 바이트기반 스트림 💡 위 스트림은 모두 InputStream과 OutputStream의 자손으로 표준화 되어있음 💡 read()와 write(int b)는 추상 메서드이기 때문에 개발자가 정의를 해야한다. 15.1.4 보조스트림 입출력의 기능은 없지만, 스트림의 기능을 향상 시키거나 새로운 기능 추가 FileInputStream fis = new FileInputStream("text.txt"); BufferedInputStr.. 더보기
자바의 정석 - 13.11 fork & join 프레임워크 13.11.1 RecursiveAction과 RecursiveTask RecursiveAction : 반환값이 없는 작업 구현 RecursiveTask : 반환값이 있는 작업 구현 public abstract class RecursiveAction extends ForkJoinTask{ protected abstract void compute(); } public abstract class RecursiveTask extends ForkJoinTask{ V result; protected abstract V compute(); //run() } 💡 쓰레드를 시작할 때 run()을 구현 하지만 start()로 실행하는 것 처럼, compute()로 구현을 하고 invoke로 작업을 시작한다. ForkJoi.. 더보기
자바의 정석 - 13.10 volatile 13.10.1 volatile 코어에서 값을 읽을 때, 캐시가 아닌 메모리에서 데이터를 읽기 위해 사용 각 코어마다 캐시가 있기 때문에, 쓰레드 작업 시 메모리의 값만 변경하므로 캐시와 데이터 불일치 문제가 발생 할 수 있다 volatile boolean suspend = false; 원자화 : 32bit JVM기준으로 데이터를 4byte로 처리하기 때문에, long과 double과 같은 큰 데이터를 하나의 명령어로 처리할 수 없다. 때문에 두 개 이상의 명령어가 필요한데, 명령어를 통한 데이터를 읽는 과정에서 다른 쓰레드가 끼어 들 수 있어 데이터 불일치 문제가 발생 할 수 있다. 이를 해결하기위해 volatile 사용 volatile long a; volatile double b; 💡 final은 상.. 더보기
자바의 정석 - 13.9 쓰레드 동기화(Synchronized) 13.9.1 동기화 한 쓰레드가 진행 중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것 임계 영역(critical section), 락(lock) 락을 획득한 쓰레드만이 임계 영역 내부에 접근 가능 13.9.2 동기화 방법 메서드 전체를 임계 영역으로 지정 public synchronized void calcSum(){ //임계 영역 } 특정 영역을 임계 영역으로 지정(메서드 내부) synchronized(객체의 참조변수){ //임계 영역 } class Ideone { public static void main (String[] args) throws java.lang.Exception { Runnable r = new RunnableEx22(); new Thread(r).start(); new Th.. 더보기
자바의 정석 - 13.8 쓰레드 실행제어 13.8.1 실행제어 생성 → 실행대기 : start() 실행대기 → 실행 실행 → 소멸 : stop() 실행 → 실행대기 : yield() 실행 → 일시정지 : suspend(), sleep(), wait(), join(), I/O block 일시정지 → 실행대기 : time-out, resume(), notify(), interrupt() resume(), stop(), suspend()는 교착상태 문제 때문에 deprecated됨 13.8.2 sleep(long millis) 일정시간동안 쓰레드 정지 예외처리를 해 주어야함(메서드 생성시 편리함) void delay(long millis){ try{ Thread.sleep(1, 500000); }catch(InterruptedException e){.. 더보기
자바의 정석 - 13.7 데몬 쓰레드(Daemon Thread) 13.7.1 데몬 쓰레드 일반 쓰레드의 작업을 돕는 보조적인 역할 데몬 쓰레드는 일반 쓰레드 종료시 강제 종료됨 ex) 가바지 컬렉터, 워드 자동저장, 화면 자동 갱신 무한루프와 조건문을 이용하여 실행 후 대기상태로 있다가 특정 조건 만족시 작업 수행 13.7.2 데몬 쓰레드 메서드 boolean isDeamon() //데몬 쓰레드 여부 확인 void setDeamon(boolean on) //매개변수를 true로 설정하면 데몬 쓰레드로 설정 13.7.3 데몬 쓰레드 지정 start()이전에 setDeamon을 호출해야 함. 그렇지 않으면 IlleThreadStateException발생 class ThreadEx implements Runnable{ static boolean autoSave = fals.. 더보기
자바의 정석 - 13.6 쓰레드 그룹(Thread Group) 13.6.1 쓰레드 그룹 보안상의 이유로 도입 되었다. 자신이 속한 쓰레드 그룹이나 하위 쓰레드 그룹 변경가능 Thread 생성자를 통해 쓰레드 그룹에 포함 가능 Thread(ThreadGroup group, String name) Thread(ThreadGroup group, Runnable target) Thread(ThreadGroup group, Runnable target, String name) Thread(ThreadGroup group, Runnable target, String name, long stackSize) 모든 쓰레드는 반드시 쓰레드 그룹에 포함되어야 함 생성자를 사용하지 않은 쓰레드는 기본적으로 자신을 생성한 쓰레드와 같은 쓰래드 그룹에 속하게 됨 생성되는 모든 쓰레드 그룹은.. 더보기