티스토리 뷰

JAVA

ThreadLocal 은 언제써야할까??

JSvsJS 2018. 12. 20. 22:55

- ThreadLocal(스레드로컬) 이란?

 The ThreadLocal class in Java enables you to create variables that can only be read and written by the same thread

 같은 스레드내에서 값을 읽고 쓰기 위해서 사용하기 위함이다.


- 사용법(Usage)

 ThreadLocal.get() : set variable to ThreadLocal

 ThreadLocal.set() : get variable to ThreadLocal

   

사용은 권장하지 않는다. 일반적인 대용량 시스템이 싱글 스레드일리는 없고, 대부분 상용 시스템은 멀티 스레드 기반의 시스템을 구성한다.

그런데 이때, ThreadLocal 은 서로 다른 값을 갖기 때문에 용이성이 떨어진다. 만약, end-to-end 거래로 Thread 재활용성 없다면 용이하지만 추천하지 않는다.(정보의 유실 가능)


또한, 스레드로컬은 메모리 누수의 주범!!(예시는 다음과 같다)

How ThreadLocal creates memory leak in Java

Iweb server and application server like Tomcat or WebLogic, web-app is loaded by a different ClassLoader than which is used by Server itself. This ClassLoader loads and unloads classes from web application. Web servers also maintains ThreadPool, which is collection of worker thread, to server HTTP requests. Now if one of the Servlet or any other Java class from web application creates a ThreadLocal variable during request processing and doesn't remove it after that, copy of that Object will remain with worker Thread and since life-span of worker Thread is more than web app itself, it will prevent the object and ClassLoader, which uploaded the web app, from being garbage collected. This will create a memory leak in Server. Now if you do this couple of time you may see java.lang.OutOfMemoryError: PermGen space . Now this brings an important question,  is it possible to to use ThreadLocal variable safely in a managed environment?  Answer is Yes,, but that requires a careful usage of ThreadLocal variable and making sure to remove the object from ThreadLocal once done.


=> 결론은 스레드 로컬사용하는 스레드 또는 서블릿의 레퍼런스 변수들이 스레드 로컬값을 가리키기 때문에 스레드로컬은 메모리상에 지속적으로 남는다. 쓸려면... clear 이후에 써라..뭐 이런내용..

개인적인 경험으로, ThreadLocal framework 를 쓰는지 모르고 sync를 async로 변경해서 개발했더니..정보가 꼬이는 현상이 있었다....아래가 조치방법이다.

 requires a careful usage of ThreadLocal variable and making sure to remove the object from ThreadLocal once done.




 

  

'JAVA' 카테고리의 다른 글

Clone() 클론 함수.  (0) 2018.12.26
MultiThread 멀티스레드  (0) 2018.12.18
Model-View-Controller(MVC) Pattern  (0) 2018.12.16
이벤트버스 패턴  (0) 2018.12.07
브로커 패턴  (0) 2018.12.03
댓글