제목: (멀티 코어를 100% 활용하는) 자바 병렬 프로그래밍 / Java Concurrency in Practice

저자: 브라이어 게츠, 더그 리, 팀 피얼스, 조셉 보우비어, 데이빗 홈즈, 조슈아 블로쉬

출판사: 에이콘


3.1.2 단일하지 않은 64비트 연산

64비트를 지원하지 않는 JVM에서 64비트를 사용하는 숫자형(double, long 등)을 사용하는 경우 동시에 여러 스레드가 같은 변수값을 읽고 쓴다면 엉뚱한 값을 가져올 수 있음. 32비트 단위로 메모리에서 fetch/store하기 때문.


3.1.4 volatile 변수

volatile 변수: 메모리 가시성(Memory Visiblity, 한 Thread에서 변경한 특정 메모리의 값이, 다른 Thread에서 제대로 읽어지는지가)을 보장하기 위한 키워드

--> synchronized 블럭으로 처리한 것과 유사하지만, 의미가 명확하지 않아 읽기 어렵고 따라서 오류가 발생할 가능성이 있다.

--> 증가연산자(++)를 사용한 부분은 동기화를 맞춰주지 않는다.


volatile 변수는 다음과 같은 상황에서만 사용하는 것이 좋다.

  • 변수에 값을 저장하는 작업이 해당 변수의 현재 값과 관련이 없거나, 해당 변수의 값을 변경하는 쓰레드가 하나만 존재할 때

  • 해당 변수가 객체의 불변조건을 이루는 다른 변수와 달리 불변조건에 관련되어 있지 않을 때

  • 해당 변수를 사용하는 동안에는 어떤 경우라도 락을 걸어 둘 필요가 없는 경우


대표적인 사용예: 간단한 상태 체크

 
올바르게 생성자가 실행된 객체는 다음과 같은 방법으로 안전하게 공개할 수 있다.
  • 객체에 대한 참조를 static 메소드에서 초기화시킨다.
  • 객체에 대한 참조를 volatile 변수 또는 AtomicReference 클래스에 보관
  • 객체에 대한 참조를 올바르게 생성된 클래스 내부의 final 변수에 보관
  • 락을 사용해 올바르게 막혀 있는 변수에 객체 참조를 보관한다.
    ex) Vector나 synchronizedList 메소드 등과 같은 동기화된 컬렉션을 생성

여러 쓰레드를 동시에 사용하는 병렬 프로그램에서 객체를 공유해 사용하고자 할 때 가장 많이 사용되는 몇가지 원칙을 살펴보면 다음과 같다.

쓰레드 한정: 쓰레드에 한정된 객체는 완전하게 해당 쓰레드 내부에 존재하면서도 그 쓰레드에서만 호출해 사용할 수 있다.

읽기 전용 객체를 공유: 읽기 전용 객체를 공유해 사용한다면 동기화 작업을 하지 않더라도 여러 쓰레드에서 언제든지 마음껏 값을 읽어 사용할 수 있다. 물론 읽기 전용이기 때문에 값이 변경될 수는 없다. 불변객체와 결과적으로 불변인 객체가 읽기 전용 객체에 해당한다고 볼 수 있다.

쓰레드에 안전한 객체를 공유: 쓰레드에 안전한 객체는 객체 내부적으로 필수적인 동기화 기능이 만들어져 있기 때문에 외부에서 동기화를 신경쓸 필요가 없고, 여러 쓰레드에서 마음껏 호출해 사용할 수 있다.
동기화 방법 적용: 특정 객체에 동기화 방법을 적용해두면 지정한 락을 획득하기 전에는 해당 객체를 사용할 수 없다. 쓰레드에 안전한 객체 내부에서 사용하는 객체나 공개된 객체 가운데 특정 락을 확보해야 사용할 수 있도록 막혀 있는 객체 등에 동기화 방법이 적용되어 있다고 볼 수 있다.



저작자 표시 비영리 변경 금지
신고


제목: (멀티 코어를 100% 활용하는) 자바 병렬 프로그래밍 / Java Concurrency in Practice

저자: 브라이어 게츠, 더그 리, 팀 피얼스, 조셉 보우비어, 데이빗 홈즈, 조슈아 블로쉬

출판사: 에이콘


01. 개요

개요 부분은 스레드를 다룰 때 많은 책들에서 언급하는 동시성 문제와 성능 위험에 대해 이야고 있음.


02. 스레드 안정성

만약 여러 스레드가 변경할 수 있는 하나의 상태 변수를 적절한 동기화 없이 접근하면 그 프로그램은 잘못된 것이다. 이를 고치는 세가지 방법.

  • 해당 상태 변수를 스레드 간에 공유하지 않거나
  • 해당 상태 변수를 변경할 수 없도록 만들거나 (불변객체?)
  • 해당 상태 변수에 접근할 땐 언제나 동기화를 사용한다.


스레드 안전한 클래스를 설계할 땐, 바람직한 객체 지향 기법이 왕도다. 캡슐화와 불변 객체를 잘 활용하고, 불변 조건을 명확하게 기술해야 한다.


추상화와 캡슐화 기법이 성능과 배치된다면 성능을 개선하기 전에 코드를 올바르게 작성하는 것이 먼저다. 

최적화는 성능 측정을 해본 이후에 요구 사항에 미달될 때만 하는 편이 좋다.


스레드 안전한 클래스란?

여러 스레드가 클래스에 접근할 때, 실행 환경이 해당 스레드들의 실행을 어떻게 스케줄하든 어디에 끼워 넣든, 호출하는 쪽에서 추가작인 동기화나 다른 조율 없이도 정확하게 동작한다면 해당 클래스는 안전하다고 말한다.

스레드 안전한 클래스는 클라이언트 쪽에서 별도로 동기화할 필요가 없도록 동기화 기능도 캡슐화한다.


2.3 락(Lock)

암묵적인(intrinsic) 락(또는 모니터 락) : 메소드 선언부에 synchronized 키워드를 지정하는 락. 해당 클래스의 인스턴스를 락으로 사용한다.


재진입성(reentrant): 특정 스레드가 자기가 이미 획득한 락을 다시 확보하는 것. 암묵적인 락은 재진입 가능하다. JVM은 락에 대한 소유 스레드와 확보 횟수를 관리한다. 

재진입성이 없다면 다음의 경우 문제가 된다. 부모/자식 클래스 둘다 synchronized 선언된 doSomething이라는 메소드가 있다. 그런데 하위 클래스에서 super.doSomething을 호출할 때 데드락에 빠지게 된다.


2.4 락으로 상태 보호하기

여러 스레드에서 접근할 수 있고 변경 가능한 모든 변수를 대상으로 해당 변수에 접근할 때는 항상 동일한 락을 먼저 확보한 상태여야 한다. 이 경우 해당 변수는 확보된 락에 의해 보호된다고 말한다.

모든 변경할 수 있는 공유 변수는 정확하게 단 하나의 락으로 보호해야 한다. 유지 보수하는 사람이 알 수 있게 어느 락으로 보호하고 있는지를 명확하게 표시하라. 


2.5 활동성과 성능

종종 단순성과 성능이 서로 상충할 때가 있다. 동기화 정책을 구현할 때는 성능을 위해 조급하게 단순성(잠재적으로 안정성을 훼손하면서)을 희생하고픈 유혹을 버려야 한다.

복잡하고 오래 걸리는 계산 적업, 네트웍 작업, 사용자 입출력 작업과 같이 빨리 끝나지 않을 수 있는 작업을 하는 부분에서는 가능한 한 락을 잡지 말아라.







저작자 표시
신고


처음 프로그래밍은 C로 배웠다. 하지만 Java는 내 주 언어다. '프로그램' 모양새를 어느 정도 갖춘 버전을 구현한 언어도 자바이고, 석사 논문 실험할 때의 언어도 자바였다. 지금은 안드로이드로 먹고 살고 있으니 내 생계수단도 자바다.


프로그래밍을 10여년이나 했지만 지금도 멀티 스레드는 두려운 대상이다. 언제 어디서 버그가 튀어 나와 괴롭힐 지 모른다. 더군다나 요즘처럼 코어 개수가 점점 늘어나고 있는 개발환경에서는 더욱 그렇다.


지금이라도 늦지 않았다. 멀티 스레드 개발을 정복해 보자(는 거창한 목표에 도전해 보자). 2008년에 출간된 책이지만 읽을 내용이 풍부하다. 


제목: (멀티 코어를 100% 활용하는) 자바 병렬 프로그래밍 / Java Concurrency in Practice

저자: 브라이어 게츠, 더그 리, 팀 피얼스, 조셉 보우비어, 데이빗 홈즈, 조슈아 블로쉬

출판사: 에이콘



목차


1장 들어가며 


1부 기본 원리

2장 스레드 안전성

3장 객체 공유

4장 객체 구성

5장 프로그래밍 단위


2부 병렬 프로그램 구조 잡기

6장 작업 실행

7장 중단 및 종료

8장 스레드 풀 활용

9장 GUI 애플리케이션


3부 가용성, 성능, 테스트

10장 가용성을 최대로 높이기

11장 성능, 확장성

12장 병렬 프로그램 테스트


4부 고급 주제

13장 명시적인 락

14장 전용 동기화 기능 구현 

15장 단일 연산 변수와 넌블로킹 동기화

16장 자바 메모리 모델 


부록 A 병렬 프로그램을 위한 어노테이션


자세한 책소개는 ☞ 여기에서




저작자 표시 비영리 변경 금지
신고


Windows 7에서는 재부팅 전 설정해 둔 네트워크 드라이브 연결이 자꾸 끊어진다.

이렇게 해결하자!!


출처: http://mosei.tistory.com/entry/Win7네트워크-드라이브-자동연결




1. 메모장에 아래 내용을 작성한 후, netstart.bat 라는 이름으로 (확장자는 bat 또는 cmd 여야 함) 저장한다. (빨간색 글씨만 각 정보에 맞게 수정해서 적어주고 검정색 글씨는 그대로 복사해서 쓰면 된다.)


set USER=아이디

set PASSWD=비밀번호

net use Z: http://file.domain.co.kr:5005 %PASSWD% /user:%USER% /persistent:no


2. 폴더옵션에서 숨김 파일, 폴더 및 드라이브 표시 에 체크 후 적용한다.



3. 아래 경로로 들어간 후, 앞서만든 netstart.bat 파일을 넣어준다. 

C:\Users\PC이름\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup




이제 재부팅을 해도 네트워크 드라이브에 자동으로 연결되어있을 것이다.

저작자 표시 비영리 동일 조건 변경 허락
신고


짬을 내서 앱을 하나 만들었습니다.

(https://play.google.com/store/apps/details?id=com.dextto.fivehundredeng)

아내에게 '미국인이 많이 쓰는 문장'이라는 링크를 보내주었더니 좋아 하길래 앱으로 만들어 들고 다니면서 공부할 수 있도록 해 주고 싶었습니다. 허접한 앱이지만 만들고 보니 애정이 생겨 마켓 등록 1호 앱이 되었네요. 컨텐츠는 원문에서 원저자께서 공유를 허락하셨으니 감사히 가져다 썼습니다. :)


안드로이드로 개발을 시작한게 2010년 초였으니, 안드로이드 개발자임에도 불구하고 4년 반이 되도록 마켓에 앱을 하나도 등록해 보지 않았다는 게 부끄러울 따름입니다.

회사일이 바쁘다는 것과 너무 허접한 앱은 마켓에 올리기가 부끄러웠고, 실력이 쌓인 후 나름 기발한 아이디어를 떠올려 검색을 했을 때엔 이미 마켓에 유사한 앱이 너무나도 많았다는 게 핑계가 되지 않음을 잘 알고 있습니다. 그래도 앱 등록 경험을 해 보는 게 중요한 것을 알기에 늦게나마 하나 올려봅니다.


사실 앱의 컨셉은 너무 간단합니다. 컨텐츠가 동적으로 바뀌는 것도 아니고 정해진 데이터로 화면을 구성하기만 하면 되니까요.

기능은 아래 화면만 보시면 딱 아실거고, 문장을 클릭하면 음성(TTS)로 읽어 줍니다.


    


TTS는 폰에 설정되어 있는 것에 따라 다르니까, 원하시는 것으로 설정하시면 됩니다. 개인적으로는 Google TTS를 추천합니다.



     

피드백 남겨 주시면 다음 업데이트에 반영하겠습니다. 여건이 되면 서버에 컨텐츠를 올릴 수 있는 메뉴도 추가하고요. ^^


그럼 영어공부 즐겁게들 하십쇼~!

저작자 표시 비영리 변경 금지
신고

'개발자 Life' 카테고리의 다른 글

500 English - 미국인이 많이 쓰는 문장 500  (2) 2014.07.19
커뮤니케이션2 - 말 줄이기  (1) 2013.05.28
커뮤니케이션1 - 용어와 발음  (0) 2013.01.30
행복한 개발자  (0) 2013.01.20
프로그래밍을 배우자  (0) 2012.02.06
10만원짜리 수표의 가치  (6) 2011.07.14