달력

4

« 2018/4 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

실습문제 정리하려고한다.

스레드는 내가 공부를 처음하는 부분이라서  

익숙하지가 않아서 정리도 좀하고..봐야겠다.. 


선생님과 같이풀었던 실습문제들 정리. .. 


이 문제를 보고 일단 생각해야할건.. 

1. 문자열을 0으로 설정하고 

2.레이블 클릭시 0.1초에 1씩 증가하는 카운팅. 

3.다시한번 클릭시 카운팅 중단 -->그리고 처음부터 시작.


스레드 중지시키기 위해서 interrupt( )메소드를 사용하고 

스레드가 살아 있는지 확인 위해서는 Thread.is Alive( )메소드 이용 


그럼일단 Swing을 이용해서 프로그램을 짠다. 

프로그램 클래스명 이름은 CountingControlFrame.java 라고 설정하겠다. 


자바의 GUI응용프로그램중에서 Swing을 사용하는것인데.. 프레임이나 컴포넌트 관련한 설명은 

추후에 설명하겠다. (왜냐면 이거 정리하는것도... 시간이 ㅋ_ㅋ )!! 


저 문제 프로그램의 구성블록을 그냥 캡처안에서 여기서 바로 정리했다 그림판으로.. 관계에 대해서

이해하려는 이유로 정리했다 저 네모박스는 { } 을 의미한다.

관계가 한눈에 들어오겠죠!! 


이런식으로 지금 프로그램이 구성되어있다. 코드는 주석으로 상세하게 설명했다. 

보고 참고하기.. 

파일첨부는 언젠가.. 

겉에 보이는 폼을 만들어준 부분이다.. 이제 안에 코드를 넣어야겠지.



코드가 잘보이는지 모르겠다... 이런 관계로 이러지는건데 


boolean bPaused =true;는 불리언 논리형은 디폴트값이 false인데 true로 초기화해주고 선언한거다.

내가 만약에 초기값을 true로 선언해주지않으면 기본값이 false기때문에 

아래 while문에서 실행이되지않으므로 프로그램 실행시 초가 증가하지 않는다. 


else 아래 Thread.start( ); 부분이 보이나? 

스레드는 한번 죽으면 새로 만들어야한다. ->다시 중지했다가 시작하고 이런게 아니다.

run이끝나면 무조건 쓰레드는 무조건 사라지므로 else if, else 는 내가 해줘야하는 부분이다.


new스레드에서 스레드가 만들어져서 변수가 스레드를 가르킨다. 

근데 이 스레드가 끝나면 사라져버린다.. 

그렇다고 변수값이 바뀌냐?? -->NO! 안바뀐다.!! 100번지 들어있다가 200번지되냐? 아니다.

왜냐하면 스레드가 NULL이 아니기 대문에... NULL은 아니고 죽어있으니까 다시 붙이면된다.

스레드가  한번 만들어서 죽어버리면 Null이 안된다. 

처음에는 null이다 그래서처음에 if문으로 null일때 만들어준거다. 


하지만 만들었을때 100번지를 가르키면 얘는 100번지를 가지고있을거다.

사라지더라도 타이머스레드의 100이라는 주소는 존재한다. 


스레드가 살았냐~ 죽었냐~ 로 판단하는거다.. 


다음은 이제 아래의 run code를 보자 


여기서 while(true)말고 

while(bPaused)라고해도 돌아간다. 


러너블이라는 인터페이스를 상속받았기 때문에 런이라는 메소드를 오버라이딩 해줘야한다. 

-->인터페이스, 상속, 오버라이딩 이라는 부분이 이해가 안가시는분은 구글링이나 검색을 .. 해보셔야한다!! 


오버라이딩은 부모에게 상속받은 메소드를 or 클래스를 내입에 맞게 재정의해서..사용하는걸 말한다


인터페이스를 사용하면 꼭 그안에있는 메소드나 클래스를 구현해줘야하는데 


나는 스레드에서 러너블이라는 인터페이스를 사용한 클래스를 만들었기 때문에 

지금 런이라는 메소드를 오버라이딩 해주고있는거다. 


런이 실행되는게 true면 0에서부터 value값을 증가해주는거고 

인터럽트가 걸리면 캐치문에서 원래 value초기값을 주고 끝내버린다. 



마지막으로 메인함수에서 내가만든 프레임을 실행한다고 new! 해주면 메인에서 돌아간다

메인에서 countingcontrolframe()을 실행시키면 아까 위에서 내가 만든 함수를 타고 생성된다..

겉껍데기 만들고 안에 돌아가는거 해주고 저 맨위에 그림을 보면서 전반적으로 구조를 판단하기.. 


실행하면 마우스 클릭시 실행되면서 숫자가 점점 올라가고 다시 클릭하면 0으로 초기화된다. 


:
Posted by Gongdile
2018. 4. 19. 16:51

[지식]스터디톡 내용 정리 스터디 /4. Java & Web2018. 4. 19. 16:51

같이 스터디를하는 개발자분께 질문드렸던 내용인데 도움이 많이되어 정리..

저에게는 도움이 되어서 정리했는데 도움됬으면 좋겠습니다. ㅎㅎ  

 

 

1.프로젝트를 6개월 단위나 단위로 작업하게되면

관련된거를 다 문서화하는가?

 

--> 산출물이 있기는하나 거의 막판에 같이 작성한다.

그때 그때 산출물 작성이 좋기는 하지만

(개발이 바빠서 산출물 챙기기는 힘들다)

 

산출물은 개인거는 아니고 프로그램 개발시 제출해야한다.

(개발이 중요하지 크게 신경쓰지 않아도 된다)

 

2.프로젝트시 신입이 가지고있어야할 최소역량이 어떤거라고 생각하시냐

 

-->습득력이라고 생각한다.

    하나를 알려줬을때 자기거를 만드는 능력.

    그리고 그런걸 종합적으로 생각하고 응용할 수 있는 능력

 

처음에는 다 모르니까 / 그렇다고 또 하나하나 100%찝어서 알려줄수도 없기에

 

==>어느정도는 자신이 해결해 가면서 묻고

생각하면서 자기것을 만들어가는 능력이 중요하다고 본다.

 

 

3.대부분의 업무 프로그램은 프로그램적인 큰 기술은 없다

특이한 경우를 제외하고는

데이터 조회, 입력, 수정 , 삭제가 대부분이다.

 

==>항목이 다르지만 행해지는 로직은 다 비슷하다.

 

실무로 들어가게되면 SI의경우 개발 초기에 표준을 다 잡는다.

-->나머지 개발자들은 그 표준에 의해서 개발한다.

-->그래야 생산성이 커지니까.

 

4. 어제 user 생성시 오류났던부분 테이블스페이스 먼저 만들고

유저 생성해야하는데 만들지 않고 유저 먼저 생성해서

오류가 난거같다.

 

-->그래서 어제 디폴트 제거했을대는 쿼리문이 실행된 이유가

유저만들어서 비밀번호랑 아이디 지정해서 만들었는데

테이블 스페이스를 안만들어놔서 디폴트를 제거한 상태로

쿼리문을 실행해서 완료된거냐?

 

-> 그렇다. 기본테이블스페이스로 지정된다 .

 

6.decode함수를 사용해서 쿼리문 보여주신적이있는데

그때 굳이 줄일필요가 없다고 말씀주셨는데 그렇다면

언제 쿼리를 수정하나?

 

-> 새로운 화면이 생겨나면 새로짜고  기존에서 항목이 변경되거나 어떤 내용을 더 보고싶을때 수정한다.

 

----> 내가 디코드 이 질문을 전에  왜했나? 디코드 함수가 나열되어있는데 비슷하고 0 ~9이렇게 번호만 연속적으로

늘어나길래  저부분을 좀쿼리를 줄일수없나 하고 질문했었던 내용이였다.

(아래 7번과 이어지는 내용)

 

7.쿼리문은 길고 짧은게 문제가 아니다. 결과의 속도다.

-->쿼리문이 길다고 속도차가 나는게 아니라. 쿼리 구성을 어떻게 하느냐가 관권이다.

 

 ex)) 10,000개의 데이터와 50,000개의 데이터를 조인할 경우에 그냥 조인했을 경우와,

조건에 따라 10,000개를 100개로 줄이고

100개와 50,000개를 조인했을때 어느게 더 빠를까 그런 문제다.

 

-->조인 방법이나 순서를 최적화하라는 말씀이시냐  -->!그렇다 그게 관권이다.

 

==>오라클의 생리를 알고 인덱스를 태우고..등등 인덱스를 태우고 안태우냐에 따라 속도는 상상이 안간다.

 

많은거에서 적은거 조인하는게 나은지

적은거에서 많은거 조인하는게 나은지

 

몇개의 규칙만 알면 쿼리결과에 문제가 없다고 본다.

 

-->오라클의 생리를 알고 sql튜닝 관련해서 생각을 많이 해보고 활용을 해야군요!

 

==>우선 기본만 정확히 알면 튜닝까지 안가도 된다고 본다.

튜닝까지 가야 할 데이터면 통계 테이블이나 집계 테이블을 만들어서 하는게 더 효율적이다.

 

ex))예를들어 방문자 보는 테이블이 있을때 하루에 10,000명 정도 들어오는데

월 방문자를 새로면 310,000정도 카운트 되지만.

 

일 배치로 12시가 지나면 그날 방문한 사람 수 총합을 저장해 놓으면

31개를 카운트만 해도 월방문자를 알 수 있다.

 

1년방문자를 구하려면 --> 일방문사 x 월 x 12

 

-->작업단위로 묶어서  연속적으로 일괄처리해서 이용하면 효율적으로 쓸수있다 이런 내용이신가! ->그렇다.

 

 

예를들어 3년간 방문자 추이를 보고 싶다 하는데

 

로우데이터(하루하루방문자 SUM)해서 1년 방문자 숫자 파악하면..아무래도 비효율적이다.

 

그래서 사실 예전에 트리거라는것을 썻다.

방문자가 방문했을시 데이터 1개가 들어가면 -->월통계 테이블은 해당월에 +1되도록 자동으로!

 

 

==>근데 이런 부분은 실무를 하다보면 자동적으로 느끼고 배운다.

 

예를들어 휴대폰요금이나 이런거 산정하는거를 건건히 데이터화해서 사용하고 이러는데

결과를 보려면 3일이 걸렸는데--> 오라클튜닝업체에서 30초만에 결과가 나오도록 쿼리변경

(물론 집계테이블도 만들어서 배치도 돌리고 했을거다.) 

 

-->현재 저의 수준은 기사나 쿼리책에 나오는 기본쿼리문정도를 사용할줄알고 기억하고있다.

     DB공부시에 같이 나가는 책 목록에 있는 기본 사용법에 대해 잘 숙지하고 사용할 수 있을정도로

     공부방향을 설정하려고한다.

 

==>우선 기본적인 공부만하면 실제 능력은 실무에서 클꺼다.

공부에는 한계가 있다. 공부로서 이해안가는 부분이

실무에 가면 왜 이렇게 해야하는지 알 수 있기 때문에

책에서는 이론적인데  실무에서 이론적으로 안되는 경우가 대부분이라고 보면 된다.

 

이론적으로 10개중 7개는 맞는데 3개는 틀릴 수 있다.

그 3개는 응용해서 만들어야 하는데

그런걸 해결하느 센스가 필요하다.

(책에는 어느정도 한계가 있다.)

 

케이스 바이 케이스다.. 책에는 이렇게 되어있지만 경우에 따라 그렇게 안할 경우도 있기때문에.

 

경험을 많이해서 많이 아는게 좋다.

 

 

8.설계 관점에 대해..

 

내가 주무를 수 있다기 보단

고객 입장에 맞는 시스템을 전문가이 내가 어떻게 만들어 줄 수 있는가에 초점을 두면 된다.

 

고객이 니드하는바 -->캐치-->그에 합당한 프로그램을 만들기.

 

프로그램을 잘짯다고 잘짠게 아니라.

 

그 고객이 오오오오오! 제가 원한 프로그램이 이겁니다! 하는게 최고의 설계다 .

 

 

 

 

 

 

 

 

 

                             

'스터디 > 4. Java & Web' 카테고리의 다른 글

2.자바 코딩 실습 & 데이터베이스 실습  (0) 2018.04.21
스터디 시작 2018.04.07~  (0) 2018.04.18
:
Posted by Gongdile

2018_04_19_목

 

모든프로그램메인에서 시작

 

국비수업에서 만든다는건 ->new의미 //클래스로 준비되어있는놈의미

 

스레드없이 자동움직이는 프로그램을 만든다? -->! 불가능! 뀨뀨!

 

-----------

 

스레드구현방법은

스레드를 상속받거나 러너블이라는 인터페이스를 구현하는 방법이다..

 

start run이라는함수를 호출해주는함수

start를 굳이해주냐 ??

 

쓰레드는 하드웨어적으로 직접실행이라 바로실행하는걸 부담시러워함

그래서 안전하게 start라는메소드를 호출하게해서

시스템내에서 체크가이루어지고 아무이상없으면 시작 !

 

--

앞으로 안드로이드 공부하게되면 통신관련해서 어떤일을해야한다하면

무조건쓰레드임

 

스마트폰관렪서 통신해야할일많음

그래서어쩔수업싱 쓰레드관련해서 공부할수밖에엄슴 ㅋㅋ..

 

NANR- >안드로이드가 반응이없다..맵이멈춰버리는 다운되는. .

이럴때 메모리킬! 이상태벌어짐 주기버림 다른앱싷ㄹ행되게

 

그래서 안드로이드에서  쓰레드가 메인을 못건드리게함

 

주소를저장하는변수

 

뉴가하는일세가지

 

램에 클래스를 만들어놈 .-> 인스턴스 한국말로 객체

클래스가객체가됨 실체객체를만들어줌

 

만들어준 주소가 반드시이슴 그 주소를 반드시 변수에넣음

 

그레퍼런스변수가 인스턴스를 가르키게됨

 

그래서 레퍼런스변수 똔느 인스턴스변수 라고하는거임 그리고 일반변수 프리미티타입

 

 

멤버변수는뭐냐? 클래스를 이루는 멤버변수.. 필드라하는데

그 클래스를이루는함수 그걸함수ㄹ안하고 메서드라 부르지

 

씨언어의 외부변수 사용해봄?

예를들어 메인이있음

int x=5;

main(){

int x=15; //지역변수

 

           while(){

           int x=25; //이안에서는 x 25  지역깡패님 지역변수

           왜지역변수냐 고지역변수에서만놈 여기를빠져나오는순간사라짐

           자동변수라고도함. .ㅋㅋㅋㅋ       

}

}<--요애를 블럭이라고함

 

근데밖에 sum이라고다른함수가있다.

 

sum(){

x  -->>얘뭐찍힘? 5지 전국짱..전역변수라함 ㅎㅎ

 

}

 

근데자바에서는 쟤네전체를 크래스로묶음

class test{

int x=5;  전역변수 ->필드라캄

main(){ c에서함수라한거를 자바에서는메소드라함

int x=15; //지역변수

 

           while(){

           int x=25; //이안에서는 x 25  지역깡패님 지역변수

           왜지역변수냐 고지역변수에서만놈 여기를빠져나오는순간사라짐

           자동변수라고도함. .ㅋㅋㅋㅋ       

}

}<--요애를 블럭이라고함

 

근데밖에 sum이라고다른함수가있다.

 

sum(){

x  -->>얘뭐찍힘? 5지 전국짱..전역변수라함 ㅎㅎ

 

}

 

}

 

c언어에서는 test.c 자바에서는 test.java

 

시언어에서 파일하나를 자바에서는 클래스라고함..

 

씨언어잘하는데 자바못하면 개바보임

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

단지왜어렵냐 용어가 너무많음 자바는 ㅋㅋㅋㅋ

 

 

우리는클래스맨들면

 

씨언어는전부다스태틱이라보믄댐

자바는 스태틱제외하고는 만들어져서

new로 맨들어씀 ..

스캐너에들어있는 next int 같은거 new로만들어줘야지

 

레퍼런스변수,생성자 (클래스이름과똑같은이르므이함수),생성자호출

 

걔가실행되니까문제가뭐냠 상속을받아버리니까 자식생성햇더니

부모생성자 자동호출됨

 

이런거공부할라하니까머리터짐

---------

구조를익히고나면 잘넣으면됨자바찡

---------------

안드로이드는 자바클래스만이용하는거임 ㅇ_

다클래스로준비되어있음

손가락으로 톽! 플리핑이라함

똑같은속도움직이는거 스크롤링

 

우린자바에서 무브라카고..드래그라하고..형태는똑같음 이름만달름

콤보박스를 안드로이드에서 스피너라캄

 

그래서완벽하게구조알고들어가면

할때편함 큐큐큐

네비게이션기능/롤링,피칭.. 등등등 plaplapla

 

-----------------------

그래서 sdk ndk pdk개발자 /그래서 단계별로 외우는거

어디취업해서1년동안 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

샤람이됨..죤냐게공부하기.. 일년되면다암..

아무리날고기어도취업시켜노면 일년되면똑같아짐 다사람취급을 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

------------------------------------

//학원다니는동안 기본에충실하자

--

기본적으로문법이나개념에 충실하면 짜집기잘할수이슴

 

내가윈도우로 창하나만든다할때..ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

c->c++->win API->MFC ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ씨언어찡..

-------------

첨에 mfc안나온거 winapi로공부해서즘 윈도우운영구조 알아야함

------

시슈템프로그래먼 ->c언어에대해서알아야함 .

 

지금나가는것들은거의클래스사용법임

 

--------------

Thread Runnnable이 있었음

스레드는 클래스로 러너블은 인터페이스임

따라서 제는 익스텐트 쟤는 임프리먼트로 받아야함

 

둘다 런이라는메소드 오버라이딩해놓음됨

마이쓰레드라는놈으로 상속받는다면

 

MyThread t = new MyThread()

           t.start(); //하면 저 런안에가 막실행됨

run {

 

 

}

 

마이투가 샹쇽받는다면

My2Thread tm = new My2Thread();

Thread tmm=new Thread(tm);

 

생성자로 한번감싸야함. . 쓰레드안에다가 내가맨든거 감싸야함

 

tmm.start();

 

근데 만들어서 집어넣으나 걍집어서서 쓰나 도긴개긴

 

쓰레드를사용하다보니까

 

------

오늘뭐나가냐 생성자 스레드  소비자스레드 가이슴

 

생성자스레드 맨들어서 안에다 차곡차곡넣음

근데 안에가꽉차면 집어넣을수엄슘

그럼 대기보다 쉬는게나음

 

소비자스레드는 계속꺼내서씀 근데 다꺼내씀

그럼 더이상꺼낼게없음 그럼쉬는게나음

이소비자쓰레드는 채워진건신경안서도됨 대신비엇는지가 걱정됨

비어잇음 쉬믄댐

 

비어서쉬고있는데 얘가만들어서 쉬고있었음

그럼어케함? 깨워줘야지 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

야 갖다채움 가져가야지

깨워줌

 저안에있는놈 공통객체..

 

콜렉션클래스사용해서 집어넣고 어레이리스트같은거사용해서

20개넘어가면 야쉬삼~~ 니가쉬삼~하고프로그래밍하면

스레드적절하게사용해서 시물레이션프로그래밍도 가능함 뿅!

 

스레드의 동기화

 

우리가 atm의 동기화를 생각해보자

동시에 접근시에 동시에빠져나가? 이럼 큰일남

동시에접근하는걸 못하도록하기위해서 동기화작업을 진행해야함 ㅎㅅㅎ

예를들어 두군데에서동시에 접근을햇음

 

내부적으로 락걸어주는게

synchronise라고 함수앞에 선언해버림

싱크로나이즈라고 선언하면 선언되어있는 이함수가 실행되고있는 동안에는

다른스레드가 접속하면 다른함수 대기하고있게됨

다실행하고끝나면 그때 락풀기 그래야 그때인출할수이슴

그럼그때 돈이없음 뀨뀨

 

a라는 쓰레드가 가라는함수호출해씀 가라는함수에서 나라는함수호출

 

여기서비라는쓰레드가 나를호출 나에서 가를호출

 

이렇게생겨먹은 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 그런데 얘네들이다 싱크로나이즈가 걸려있음 비가실행행해서가를호출해봐 되게씀? 노노 

에이에서 가에서 나호출할라햇는데 호출되겟음? 노노 à이런경우를 교착상태의 기아상태 라고함

파워를뽑아야함ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 요런걸조심하기

 

공통으로 접근안하게할려면그 임의의 코드블록을 임계영역으로 지정해서ㅕ 싱크로나이즈 하는방법도이슴

공통으로 실행안됫으면 하는부분을 묶어서 뿅..

대부분 일반적으로 함수앞에다써주지만 대신 예를들어

쓰레드의 실행되야할내요이 너무많아 근데그중일부분만 이게포함된다면

다른부분실행되야하기 때문에 적절하게 싱크로나이즈블록사용해서 하면될거같다

 

Th.join()은 뭐냐

자바는 메인이끝나면 프로그램이 끝나자늠 그러면 화면에서 프레임은 사라졋음 근데 음악소리는 계속 나겠지 

화면은사라졌는데 음악은안멈춤

> 메인은화면을없앴는데 메인에서만든 쓰레드가 소리를만드는줌임 음악

스레드가끝날때까지 윈도우가 사라지지않는거 이게 조인임

691쪽부터 실습문제 요거.. 1번부터 쭉 5번까지 해보기

예제 2 화면하나에 레이블붙여놓고 카운팅시작하는거

예제를 스스로하는것도 중요하지만 예제를 통해서 해보는것도 중요함 1번부터 5번까지 한번내용을 쭉 읽어보기 ..

 

연습문제 1~5번으로공부하기 처음부터짜는거 너무고민하지말기

시간이 좀 많이 걸림

스레드를 이용하지않는 프로그램이없기 때문에 한번 해보기

--

13-4예제

랜덤함수 수시로 좌표값바구기

범위를한정해서 바꾸는거  왜냐면 너무넓ㄱ세왓다갓다하면 진동같지않으니까  

------------------2번예제랑 3번예제랑 5번예제 나갔는데

지금 일단 정리해둔거 올린거라서 오타도많고 좀 더러운데 나중에 수정하기

 

'[국비]자바기반 응용SW과정 > 일지 ' 카테고리의 다른 글

2018-05-02 C언어 수업  (0) 2018.05.02
:
Posted by Gongdile

쓰레드의 동기화(synchronization)이란 뭘까? 

--> 한스레드가 진행중인 작업을 다른 쓰레드가 간석하지 못하도록 막는것을 말한다.


왜쓸까? 


싱글스레드 프로세스 경우는 프로세스 내에서 단하나의 스레드만 작업하기 때문에 

프로세스의 자원을 가지고 작업하는데 별 문제가 없다. 


하지만 

멀티스레드의경우에는 여러 스레드가 같은 프로세스 내의 자원을 공유해서 작업하기 때문에 

서로의 작업에 영향을 주게된다. 


예를들면 

ATM에 통장에 50만원이있었는데 각 다른 두곳에서 출금한다고 가정하자 ㅋㅋ 

동시에 두곳에서 50만원이 출금되면 정말 행복하겟지만.. 

은행입장에서는 큰일나는거 아닌가 ..ㅋㅋㅋ 


A atm기에서 작업을 실행할대 락을 걸어서 다른 곳은 접근못하게하고 출금이 다끝난뒤에 

접근권을 획득해서 B atm기가 출금해야 이중으로 출금되는것을 막을수있다. 

--------------------------------------------------------------------------------------------


그래서 스레드에서는 저런 일이 방지하는것을 막기위해서


한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드에 의해 방해받지 않도록 하는것이 필요한데


그래서 도입된 개념이 '임계 영역(critical section)'과 '잠금(락,lock)'이다.


->공유 데이터를 사용하는 코드 영역을 임계 영역으로 지정해놓고, 공유 데이터(객체)가 

가지고 있는 lock을 획득한 단 하나의 쓰레드만 이 영역 내의 코드를 수행할 수 있게 한다.

그리고 해당 쓰레드가  임계 영역 내의; 모든 코드를 수행하고 벗어나서 lock을 반납해야만 

다른 쓰레드가 반납된 lock을 획득하여 임계 영역의 코드를 수행할 수 있게 된다. 


-------------->위에서 말한것처럼 이런 한 쓰레드가 진행 중인 작업을 다른 쓰레드가 간석하지 못하도록 막는것을!! 

'쓰레드의 동기화(Synchronization)' 라고 한다.   


동기화 방법에는 여러가지가있다. synchronized를 이용한 방식, wait ( ) , notify( ) , notifyAll( ) 를 이용한 방식.. 

여러가지가있는데 오늘은  synchronized를 이용한 방식에 대해 설명할 예정이다.. 

(여러개를 포스팅하고싶지만.. 힘들다 ㅠㅠ 조금이라도 꾸준히 올리는게 목표다)


1.synchronized를 이용한 동기화 


가장 간단한 동기화 방법인 synchronized 키워드를 이용한 동기화에 대해서 알아보면 

이 키워드는 임계 영역을 설정하는데 사용된다. -->두가지 방식이있다. (사진이 생각보다 짱큰게 올라갔다)


<첫 번째 방법>

메서드 앞에 synchronized를 붙이는방법 

synchronized를 붙이면 메서드 전체가 임계영역으로설정된다. 

쓰레드는 synchronized메서드가 호출된 시점부터 해당 메서드가 포함된 객체의 lock을 얻어 작업을 수행한다.

메서드가 종료되면 lock을 반환한다.


<두 번째 방법>

메서드 내의 코드 일부를 블럭 { }으로 감사고 블럭 앞에 'synchronized(참조변수)'를 붙이는 방법

이때 참조변수는 --> 락을 걸고자하는 객체를 참조하는것이어야한다. 


이 {  }블럭을 synchronized블럭이라고 한다. 

->이 블럭의 영역 안으로 들어가면서부터 쓰레드는 지정된 객체의 lock을 얻게되고. 

   블럭을 벗어나면 lock을 반납한다.


-----------

두 방법 모두 lock을 하나씩 가지고 있다.

해당 객체의 lock을 가지고 있는 쓰레드만 임계 영역의 코드를 수행할 수 있다.

그리고 다른 쓰레드들은 lock을 얻을 때가지 기다리게 된다.

------

임계 영역은 멀티쓰레드 프로그램의 성능을 좌우하기 때문에 가능하면 메서드 전체에 락을 거는것보다 

synchronized블럭으로 임계 영역을 최소화해서 효율적인 프로그램이 되도록 노력하는게 좋다.



아래는 synchronized 사용예제에 대해서 설명할거다 


쓰레드 동기화를 사용한 경우와 사용하지 않은 경우의 차이를 간단한 예제를 통해서 설명하려고한다.


공쓰레드와 다일쓰레드가 사용하는 부분을 보여줄 예정이다. 



위에 소스는 

gong과 dile이라는 이름의 스레드를 생성하여 집계판에 동시에 접근하게 한것이다. 

그리고 두 스레드를 실행시키는 부분이다. 


위에 소스와 이어서 타이핑 친부분이다 아래는 

공유 데이터인 집계판을 시물레이션하는 클래스를 만든거다.

이제 아래 소스를 보자 


최종적으로 소스에 흐름에 대해서 설명하자면 


SyncObject멤버 add( )를 synchronized 메소드로 지정했다. 

왜??!

-->add ( )는 두명의 gong,dile 즉 WorkerThread 스레드가 동시에 호출할수있는 임계영역이기 때문이다.

    또한 add( ) 메소드는 sum 공유변수에 접근하고 있기 때문이다. 


WorkerThread는 루프를 돌면서 27번줄에 SyncObject의 add( )메소드를 호출하여 

SyncObject의 sum 멤버 값에 10을 더하고 리턴한다. 

main은 이름이 "gong","dile"인 두개의 WorkerThread 스레드를 생성한다. 


최종 sum이 얼마일꺼같나? ㅋㅋ -->200이다!! 왜??1 

gong와 dile이가 각각 10번씩 add( )를 호출했기때문에 

동기화가 잘이루어진다면 최종 누적점수 sum이 200이 된다. 


그림으로 표현하면 이렇다.. 


어떤 형식으로 찍힐까?

이런식으로 gong과 dile이가 순차적으로 sum되가면서 찍힌다. 


근데 만약에 synchronized키워드를 제거하게 되면 어떻게 출력될까?


실행할때마다 다르긴한데  충돌이된 예시를 보여주자면 


위에 네모박스처럼 add( ) 메소드에 충돌이 생긴경우다

-->이때문에 10이 증가되지못했다.


아래 밑줄처럼 두 스레드의 add(  ) 메소드에 대한 동시 실행으로 인해 190밖에 도달하지 못했다.


근데 저 코드를 맨날 실행한다고 같은 결과가 나오는건 아니다 

여러번 충돌할수도있는거고 충돌안할수도있는거고 하지만 동기화를 해주지 않으면

충돌할 위험이 있기 때문에 해줘야한다. 


두개의 스레드가 동시에 호출할 경우가 발생할 위험이있기때문에 동기화 처리를 해주는거다. 


2.wait( )과 notify( )를 이용한 방식 은 나중에 정리하겠다!! 


:
Posted by Gongdile
2018. 4. 19. 00:55

1.계획 스터디 /5.JSP & Servlet2018. 4. 19. 00:55

같이 국비를 듣는분에게 jsp와 Servlet 을 알려드리기로했다.


그래서 내가 더욱 더 틀린내용 없이 전달해드리기 위해 공부해야한다 ㅎㅎㅎㅎㅎ !! 


다음주부터 조금씩 조금씩 알려드릴 계획이기 때문에 


여기다가 내용을 정리하겠다 하하하하 



---------

일단 책한권은 다봤는데 혹시몰라서 여러권빌렸다.. 정리해서 알려드려야지 도움이 되고싶다 ㅎㅎ 

지금은 다른책한권 읽는중인데 1권빌린부분에 대해서 정리를 좀 해야겠다. 



일단은 


1.웹프로그래밍이 뭔지 

2. 웹서비스가 어떤건지 -> HTTP가뭐냐..? 어떻게 동작하냐

3.웹서비스는 어떤방식으로 동작하냐

4.우리가 수업시간에 배운 서블릿과 JSP는 어떤방식으로 동작하는지 -->특징이뭔지 

------------------------

알려드리고이제 서블릿이랑 JSP에 대해서 정리해서 알려드릴껀데 


세션과 쿠키, 포워드와 리다이렉트의차이, 포스트방식과 겟방식.. 이런거 차이 알려드릴꺼다 이건 꼭! 


1.서블릿 

-GET방식에서는 처리를어떻게하고 POST방식에서는 처리를 어떻게하냐?

- 한글 인코딩하는 방법은?


2.JSP 기초 

-JSP는 서블릿이랑 어떤차이가있는지 어떻게 생겨먹은아이인지 어떻게 사용하는지 

-구성요소가뭔지 


3.JSP에서 내장객체  

내장객체의 종류는 어떤게 있고 어떻게 사용하는지  


4.JSP에러처리 -->어떤방식으로 에러처리를 하는지 


5.JSP 세션관리 

-HTTP 프로토콜 연결방식 

-쿠키,세션등.. 

--------------

학원에서 진도나가신 예제등을 통해서 어떤방식으로 나가고 들어가고 주고받는지에 대해서 설명해드리고

기본적인 문법에 대해서 알려드릴 예정이다 그래야 얘가 어떤방식으로 주고받고 사용하는지 알게되니까 


-----------

서블릿 JSP활용

1.JSP의 액션태그  

액션태그 사용해서 넘어가는 방법들.. 그리고 자바빈사용해서 넘어가는 방법들에 대해서 알려드릴 예정이다 


근데 학원에서는 액션태그랑 자바빈하면서 JSTL 이랑 EL태그 편의성에대해 설명하고 예제로 코드사용을 훅훅나갔기때문에 이부분에 대해서 학원에있는 다른분한테 소스파일 받아서 설명해드릴 예정이다 



2.JDBC프로그래밍 

My sql을 사용해서 진도를 나갔는데 데이터베이스 연결 구문관련해서 정보가 필요하니까 ..

디비관련 메소드 사용방법에 대해서 정리해서 알려드릴 예정.. PrepareStatement 사용하거나 커넥션풀 사용하는거 



3.EL/커스텀태크/JSTL

더 유용하게 사용하기위한 방법들인데 구문들 섞어서 유용하게 사용하기 때문에 이거 관련해서 사용하는 방법.. 




마지막으로 Model2방식으로 게시판 설계하는거에 대해 코드 출력해서 설명해 드릴예정..

일단은 이 책에있는 예제들 이용해서 사용하는걸로 생각해보긴 할건데 


지금 학원에서 나갔던 소스코드 출력해서 돌아가는부분 출력해서 구문설명해서 코딩하는 방법도 생각하고있다

아무래도 익숙한게 좋으니까 학원에서 나가는 코드 말고도 


책에있는 코드로 내가한번 연습해보고 알려드리는것도 좋은거같다 


지금 내가 이걸 공부하고있는 목적은 지금 당장 어떻게든 잘짜는게 아니라 

이걸 왜 사용하고 어디에 사용하고 왜쓰는지에 대해 설명해드리는게 목적이니까 



-------------

현재 학원에서는 기본적인 게시판 만드는건 나가는 상태에서 mvc모델에서 ajax사용하는 부분에 대해서 나가고있다.

학사관리 시스템이나 독서관련 시스템에서 웹으로 이동하지않고 바로 ajax로 삭제수정해서 화면보여줄수있는 방식 

나가고있는데 데이터 형식이 json으로 파싱해서 보여주는 부분이다 


제이쿼리안에있는 ajax 사용해서 json jar파일안에넣고 제이선으로 파싱해서 ajax로 보여주는 부분인데

이번주 국비과정말고 그전에있던 소스코드랑 이번주에 나간 부분이랑 어떻게 다른지 소스코드 출력해서 구문명에대해서 설명해야겠다고 생각한다. 1~100까지 다알고있는것도 좋겠지만 일단 지금나가는부분에 대해서도 어느정도 알아야하니까 근데 그전에 기본적인 부분에 대한 설명이 먼저! 


DAO,VO,Servlet ..등등등 정의에대해 알고 왜쓰는지 알아야하고 차이를알아야하고 간단하게하는법에 대해서 알아야하고 ㅎㅎㅎㅎㅎㅎ 

정리할게 많지만 누구에게 알고있는지식을 더 공부해서 알려줄수있다는 뿌듯함이 있다 


열공하자 


:
Posted by Gongdile