inflearn logo
강의

Course

Instructor

Solid Foundation! Starting Java Intensively Part 3 (Part 2): Sockets and File I/O

파일 접근 오류 (경쟁 조건) <-- Lock 관련 질문

Resolved

79

syh8088

77 asked

0

image.png

해당 로직을 보니깐 리엔트리 락을 사용 하고 있는 것을 보여집니다.

그런데 말씀 하신 내용 처럼

 

T1 스레드가 "Hello"

T2 스레드가 "World"

 

특정 파일에 쓰기를 동시적으로 여러번 하는데

HWellorl <-- 이렇게 단어가 혼잡되어서 쓰기가 되지 않는 이유에 대해서 이해가 안가서 질문 드립니다.

 

1번 쓰레드가 writeData("Hello");

2번 쓰레드가 writeData("World");

 

이렇게 멀티스레드로 실행하게 된다면

writeData 메소드를 구현하신 내용을 보면

FileWriter writer = new FileWriter("C:/Tmp/test.txt");

이렇게 새롭게 인스턴스를 새롭게 만들어서 각각 실행하기 때문에

this.lock

해당 lock 객체를 호출 할때 각각 스레드 수준에서 ThreadSafe 한 것이 아닌가요? (제가 잘못 알고 있을 수도 있습니다! )

 

그러니깐 만약 이렇게

FileWriter writer = new FileWriter("C:/Tmp/test.txt");

Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                   writer.write("World");("Hello");
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    writer.write("World");
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        });

 

writer 전역 변수를 만약에 T1 쓰레드하고 T2 쓰레드가 동일하게 참조해서 사용한다면 이해가 갈텐데

선생님께서 만들어주신 코드는 지역 변수로 FileWriter 객체를 생성하고 지역 변수 내에서 소멸되기 때문에 T1, T2 하고 동시화 기법에는 동작 하지 않을 것 같아서 질문 드립니다.

 

 

java 네트워크 tcpsocket

Answer 1

0

nullnull8537

우선 Java에는 전역 변수가 없습니다. 대신 클래스 변수인 정적 변수가 있긴 합니다. 그리고 무엇보다 중요한 것은 클래스에 대한 참조 변수는 말 그대로 참조일 뿐 대상 인스턴스의 생존 여부와 무관합니다. 모두 다 GC가 알아서 처리하기 때문입니다. 지역 변수인 클래스 참조자가 사라진다 해서 대상 인스턴스까지 사라지는 것은 아닙니다.

그리고 질문 초기에 보이는 write() 메서드는 그 내부에서 동기화를 실시하고 있기 때문에 여러 스레드에서 동시에 write()를 호출하더라도 실제로 호출 할 수 있는 것은 한 스레드로 제한됩니다. 이 때문에 문자열이 서로 뒤섞이지 않은 것입니다. 참고하시기 바랍니다. 😄

강의자료 pdf

0

5

1

패키지 구분에 대해 궁금한게 있습니다

0

7

1

안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.

0

16

1

수강기간 연장 가능하실까요?

0

20

2

갑자기 채점 사이트가 바뀌었어요

0

19

1

문제 리스트 페이지

0

22

1

part8 Notion 링크

0

22

1

채점 사이트 관련 질문드립니다

0

20

1

인텔리제이 MCP 서버 설정 관련

0

25

1

조회속도 개선에서 더 개선하는 방법이 궁금합니다.

0

28

2

필기자료 사라졌나요?(실기 일주일만에 안돼서 재도전-_-)

0

37

2

네트워크 전체 흐름 복습 질문

0

29

2

맥북으로 RDP 연결 질문

0

29

2

질문있습니다

0

25

1

08_chatServerSelector 코드 중 오류를 발견하여 문의 남깁니다.

0

63

2

"이전 시간 강의 예제코드 실행시 왜 0bytes가 나오는지"에 대한 설명에 대한 질문 남깁니다!

0

46

2

reader.readLine() == null 의미

0

74

2

윈도우 IOCP 가 DMA 랑 다른 개념인가요?

0

90

1

소켓의 본질은 파일이다.

0

78

2

확장자에 대하여.. 문득 깨달은게 맞는지 확인.

0

94

2

게임과 스트림에 대해서 (이해한게 맞는지 확인 질문)

0

92

2

mac 사용자 폴더 생성 경로 변경

1

124

2

createNewFile() 멱등성

0

72

2

잘못 작성

0

94

2