René's URL Explorer Experiment


Title: 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 · Study-2-Effective-Java · Discussion #12 · GitHub

Open Graph Title: 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 · Study-2-Effective-Java · Discussion #12

X Title: 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 · Study-2-Effective-Java · Discussion #12

Description: 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

Open Graph Description: 0. 들어가며 이번 아이템은 싱글턴 패턴을 안정적으로 구현하기 위한 방법들에 대한 내용입니다. 각각의 방법들을 예제 코드와 함께 알아보겠습니다. 1. 싱글턴이란? 싱글턴(singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. (Effective java 책 23p) '오직 하나만 생성할 수 있다' 라는 말은 '인스턴스가 하나만...

X Description: 0. 들어가며 이번 아이템은 싱글턴 패턴을 안정적으로 구현하기 위한 방법들에 대한 내용입니다. 각각의 방법들을 예제 코드와 함께 알아보겠습니다. 1. 싱글턴이란? 싱글턴(singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. (Effective java 책 23p) '오직 하나만 생성할 수 있다' 라는 말은 &#...

Opengraph URL: https://github.com/orgs/Study-2-Effective-Java/discussions/12

X: @github

direct link

Domain: patch-diff.githubusercontent.com


Hey, it has json ld scripts:
{"@context":"https://schema.org","@type":"QAPage","mainEntity":{"@type":"Question","name":"아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라","text":"

0. 들어가며

\n

이번 아이템은 싱글턴 패턴을 안정적으로 구현하기 위한 방법들에 대한 내용입니다.
\n각각의 방법들을 예제 코드와 함께 알아보겠습니다.

\n

1. 싱글턴이란?

\n
\n

싱글턴(singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다.
\n(Effective java 책 23p)

\n
\n

'오직 하나만 생성할 수 있다' 라는 말은 '인스턴스가 하나만 존재해야 한다' 라고 해석할 수도 있습니다.
\n즉, 싱글톤 구현을 위해서는 Java 의 런타임 환경인 JVM 에서 단 하나의 인스턴스만 생성되도록 구현해야 한다고 생각할 수 있습니다.

\n

1.1 싱글턴의 특징

\n
\n1. 메모리 절약\n

모든 객체는 생성되면 JVM 의 heap 메모리에 저장됩니다.
\n그러나 싱글턴 객체는 단 한번만 생성되기 때문에 최초에 생성된 단 한개의 객체만 heap 에 저장됩니다.
\n이후 모든 클라이언트는 해당 객체를 공유하기 때문에 메모리를 효율적으로 사용할 수 있다는 이점이 있습니다.

\n
\n
\n2. 데이터 공유\n

싱글톤으로 구현된 객체는 JVM heap 에 저장된 하나의 객체를 모든 클라이언트들이 공유하게 되는데요.
\n만약 싱글톤 객체에 공유할 정보를 넣어놓는다면 손쉽게 모든 클라이언트들이 공유할 수 있게 됩니다.

\n
\n
\n3. 멀티스레드 환경을 고려해야 함\n

다수의 클라이언트에서 하나의 객체, 즉 하나의 자원을 공유하는 상황이다 보니 자칫하면 치명적인 문제가 발생할 수 있습니다.
\n싱글톤 구현 시 멀티스레드를 고려하지 않으면 여러 클라이언트에서 하나의 자원에 접근하며 레이스 컨디션이 발생할 수 있습니다.
\n만약 싱글턴의 생성 로직에서 레이스 컨디션이 발생한다면, 여러개의 객체가 생성되는 일도 발생할 수 있습니다.

\n
\n
\n4. 싱글턴을 사용하는 클라이언트를 테스트하기 어려움\n

테스트 케이스들을 작성할 때 필연적으로 다양한 입력값, 출력값을 정의해야 합니다.
\n만약 싱글톤 클래스가 불변객체이고, 생성자를 통해서 값을 주입받는 다면 어떨까요?
\n그렇게 된다면 이 싱글톤 클래스를 사용하는 코드를 테스트할때 어려움이 생기게 됩니다.

\n

이런 부분을 방지하고자 한다면 싱글톤 클래스가 특정 인터페이스를 상속하게 하는 방법이 있습니다.

\n
interface Something {\n    void doSomething();\n}\n\nclass SingletonSomething implements Something {\n\n    @Override\n    public void doSomething() {\n        // do something\n    }\n}
\n
\n

2. 싱글턴을 구현하는 방법

\n
    \n
  1. public static final 필드
  2. \n
  3. 정적 팩터리
  4. \n
  5. 열거 타입 활용(enum)
  6. \n
  7. LazyHolder 방식
  8. \n
\n

1,2,3번 방식은 Effective java 에서 제안하는 방식이고, 4번은 추가로 소개하고싶은 방법입니다.
\n1번부터 차례대로 살펴보겠습니다.

\n

2.1 public static final 필드

\n
/**\n * 1. public static final 필드 방식\n */\npublic class Singleton1 {\n    public static final Singleton1 instance = new Singleton1();\n    private Singleton1() { }\n}
\n\n

2.2 정적 팩터리 방식

\n

정적 팩터리 방식에서는 여러가지 방법을 사용할 수 있습니다.
\n이 방식들의 공통적인 특징은 다음과 같습니다.

\n\n

1) static final 필드 활용

\n
/**\n * 2. 정적 팩터리 방식\n *     1) static final 필드 활용\n */\npublic class Singleton2_1 {\n    private static final Singleton2_1 instance = new Singleton2_1();\n    private Singleton2_1() { }\n\n    public static Singleton2_1 getInstance() {\n        return instance;\n    }\n}
\n

2.1 과 특징이 같습니다.

\n\n

2) Lazy Initialization(지연 초기화)

\n
/**\n * 2. 정적 팩터리 방식\n *     2) Lazy Initialization(지연 초기화)\n */\npublic class Singleton2_2 {\n    private static Singleton2_2 instance;\n    private Singleton2_2() { }\n\n    public static Singleton2_2 getInstance() {\n        if (instance == null) {\n            instance = new Singleton2_2();\n        }\n\n        return instance;\n    }\n}
\n

1)번 방법은 사용하지 않아도 불필요하게 객체가 생성된다는 단점이 있었습니다.
\n하지만 지연 초기화 방법을 사용하면 그러한 점을 해결할 수 있습니다.

\n\n

3) Lazy Initialization + Synchronization(지연 초기화 + 동기화)

\n
/**\n * 2. 정적 팩터리 방식\n *     3) Lazy Initialization + Synchronization(지연 초기화 + 동기화)\n */\npublic class Singleton2_3 {\n    private static Singleton2_3 instance;\n    private Singleton2_3() { }\n\n    public static synchronized Singleton2_3 getInstance() {\n        if (instance == null) {\n            instance = new Singleton2_3();\n        }\n\n        return instance;\n    }\n}
\n

멀티스레드 환경에서 레이스 컨디션이 발생하는 경우를 방지하기 위해 동기화를 사용하는 방법입니다.
\nJava 의 synchronized 키워드를 이용해서 동기화 문제를 해결합니다.

\n\n

4) LazyHolder 방식

\n
/**\n * 4. LazyHolder 방식\n */\npublic class Singleton4 {\n\n    private Singleton4() { }\n\n    private static class LazyHolder {\n        private static final Singleton4 INSTANCE = new Singleton4();\n    }\n\n    public static Singleton4 getInstance() {\n        return LazyHolder.INSTANCE;\n    }\n}
\n

LazyHolder 방식은 지연 초기화 방식의 성능적 문제를 개선하기 위해 제안된 방법입니다.
\nsynchronized 키워드를 사용하면 JVM 내부적으로 락을 획득하는 작업 때문에 성능 저하가 발생합니다.
\n하지만 이 방법은 Classloader 에 Singleton4 인스턴스 생성 역할을 맡기며 지연 초기화를 구현하는 방법인데요.
\n클래스 로드와 초기화 과정은 thread-safe 하게 동작하는데, 이는 synchronized 보다는 성능이 좋다고 합니다.
\n(참고한 글 : https://medium.com/@joongwon/multi-thread-환경에서의-올바른-singleton-578d9511fd42)

\n\n
\n

개인적으로는 synchronized 키워드와 Classloader 의 thread-safe 한 동작에서 왜 성능차이가 있는건지 궁금한데요.
\n이 부분은 조금 더 알아봐야할 것 같습니다.

\n
\n

3. 조금 더 생각해볼 것들

\n\n
\n
\n

토론하고싶으신 부분이나 질문이 있으시면 편하게 남겨주세요.

\n
","upvoteCount":3,"answerCount":3,"acceptedAnswer":{"@type":"Answer","text":"

싱글턴을 만들때 3) Lazy Initialization + Synchronization(지연 초기화 + 동기화) 방식으로 멀티스레딩의 문제를 해결하기 위해 사용한 synchronized로 인한 성능의 문제를 해결하는 방법으로
\n4) LazyHolder 방식을 사용 하였는데 저도 처음 알게 되었습니다.

\n

3) 문제를 해결하는 방법으로 4) 말고도 알고있는 내용으로는
\nDCL(Double Checked Locking) 방식에 대해 알고 있습니다.

\n
public class Singleton3 {\n\n    private volatile static Singleton3 uniqueInstance;\n\n    private Singleton3() {}\n\n    public static Singleton3 getInstance() {\n        if (uniqueInstance == null) {\n            synchronized (Singleton3.class) {\n                if (uniqueInstance == null) {\n                    uniqueInstance = new Singleton3();\n                }\n            }\n        }\n        return uniqueInstance;\n    }\n}
\n

3) 방식의 문제는 동기화가 꼭 필요한 시점은 아직 객체가 생성되지 않은 상태일 뿐 인데 모든 상황에 동기화가 일어나기 때문입니다.
\n따라서 uniqueInstance가 아직 생성되지 않은 시점에서만 synchronized를 통해 동기화를 한다면 성능을 좀 더 올릴 수 있는 것으로 압니다.
\n(객체가 생성된 이후에는 이미 만들어진 객체를 반환만 하면 됨)
\n

\n\n
\n이번 아이템을 통해 싱글턴을 만드는 여러 방법에 대해 알게 되었고 싱글턴을 만들게 됨으로써 생기는 문제점을 해결하기 위해 각 방식이 생겨나게 된 이유도 알게 되었습니다.\n
\n정리 감사합니다.","upvoteCount":1,"url":"https://github.com/orgs/Study-2-Effective-Java/discussions/12#discussioncomment-4445631"}}}

route-pattern/_view_fragments/Voltron::DiscussionsFragmentsController/show/orgs/:org/:discussion_number/discussion_layout(.:format)
route-controllervoltron_discussions_fragments
route-actiondiscussion_layout
fetch-noncev2:d99dcada-aff1-2a14-163c-286395a026ed
current-catalog-service-hash9f0abe34da433c9b6db74bffa2466494a717b579a96b30a5d252e5090baea7be
request-idE3C8:3EABC2:2F4FA2D:3F5C73A:696F1CFE
html-safe-nonce7a6e72d9d2e3b4b2b65308bed07acd0dc8933b81a848f90c52730ae7252a1eba
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFM0M4OjNFQUJDMjoyRjRGQTJEOjNGNUM3M0E6Njk2RjFDRkUiLCJ2aXNpdG9yX2lkIjoiNzg0NjY0MzA2MDk4NzMzNzk4MiIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9
visitor-hmacbf01ad508cf3c761f158e79564dcdb4fcac0d3ca1cca99065b004208d074ac39
hovercard-subject-tagdiscussion:4656697
github-keyboard-shortcutsrepository,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///voltron/discussions_fragments/discussion_layout
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/_view_fragments/Voltron::DiscussionsFragmentsController/show/orgs/Study-2-Effective-Java/12/discussion_layout
twitter:imagehttps://opengraph.githubassets.com/57c4610a174c6c75385f14fd697045bd8eb6f3d54dc41c00c373eb5ff070cb9a/orgs/Study-2-Effective-Java/discussions/12
twitter:cardsummary_large_image
og:imagehttps://opengraph.githubassets.com/57c4610a174c6c75385f14fd697045bd8eb6f3d54dc41c00c373eb5ff070cb9a/orgs/Study-2-Effective-Java/discussions/12
og:image:alt0. 들어가며 이번 아이템은 싱글턴 패턴을 안정적으로 구현하기 위한 방법들에 대한 내용입니다. 각각의 방법들을 예제 코드와 함께 알아보겠습니다. 1. 싱글턴이란? 싱글턴(singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. (Effective java 책 23p) '오직 하나만 생성할 수 있다' 라는 말은 '인스턴스가 하나만...
og:image:width1200
og:image:height600
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
Noneb278ad162d35332b6de714dfb005de04386c4d92df6475522bef910f491a35ee
turbo-cache-controlno-preview
octolytics-dimension-user_id120388640
octolytics-dimension-user_loginStudy-2-Effective-Java
octolytics-dimension-repository_id577325341
octolytics-dimension-repository_nwoStudy-2-Effective-Java/Effective-Java
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id577325341
octolytics-dimension-repository_network_root_nwoStudy-2-Effective-Java/Effective-Java
turbo-body-classeslogged-out env-production page-responsive
disable-turbofalse
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release39aed5006635ab6f45e6b77d23e73b08a00272a3
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12#start-of-content
https://patch-diff.githubusercontent.com/
Sign in https://patch-diff.githubusercontent.com/login?return_to=https%3A%2F%2Fgithub.com%2Forgs%2FStudy-2-Effective-Java%2Fdiscussions%2F12
Study-2-Effective-Javahttps://patch-diff.githubusercontent.com/Study-2-Effective-Java
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub SparkBuild and deploy intelligent appshttps://github.com/features/spark
GitHub ModelsManage and compare promptshttps://github.com/features/models
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
GitHub SponsorsFund open source developershttps://github.com/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/accelerator
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://patch-diff.githubusercontent.com/login?return_to=https%3A%2F%2Fgithub.com%2Forgs%2FStudy-2-Effective-Java%2Fdiscussions%2F12
Sign up https://patch-diff.githubusercontent.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fvoltron%2Fdiscussions_fragments%2Fdiscussion_layout&source=header-repo&source_repo=Study-2-Effective-Java%2FEffective-Java
Reloadhttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
Reloadhttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
Reloadhttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
Effective-Java-Study https://patch-diff.githubusercontent.com/Study-2-Effective-Java
Overview https://patch-diff.githubusercontent.com/Study-2-Effective-Java
Repositories https://patch-diff.githubusercontent.com/orgs/Study-2-Effective-Java/repositories
Discussions https://patch-diff.githubusercontent.com/orgs/Study-2-Effective-Java/discussions
Projects https://patch-diff.githubusercontent.com/orgs/Study-2-Effective-Java/projects
Packages https://patch-diff.githubusercontent.com/orgs/Study-2-Effective-Java/packages
People https://patch-diff.githubusercontent.com/orgs/Study-2-Effective-Java/people
Overviewhttps://patch-diff.githubusercontent.com/Study-2-Effective-Java
Repositorieshttps://patch-diff.githubusercontent.com/orgs/Study-2-Effective-Java/repositories
Discussionshttps://patch-diff.githubusercontent.com/orgs/Study-2-Effective-Java/discussions
Projectshttps://patch-diff.githubusercontent.com/orgs/Study-2-Effective-Java/projects
Packageshttps://patch-diff.githubusercontent.com/orgs/Study-2-Effective-Java/packages
Peoplehttps://patch-diff.githubusercontent.com/orgs/Study-2-Effective-Java/people
Answered https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12#discussioncomment-4445631
JoisFehttps://patch-diff.githubusercontent.com/JoisFe
jinan159 https://patch-diff.githubusercontent.com/jinan159
3. 과제https://patch-diff.githubusercontent.com/orgs/Study-2-Effective-Java/discussions/categories/3-%EA%B3%BC%EC%A0%9C
아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12#top
jinan159 https://patch-diff.githubusercontent.com/jinan159
Answered https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12#discussioncomment-4445631
JoisFehttps://patch-diff.githubusercontent.com/JoisFe
Return to tophttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12#top
Please reload this pagehttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
Please reload this pagehttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
jinan159 https://patch-diff.githubusercontent.com/jinan159
Dec 13, 2022 https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12#discussion-4656697
싱글턴 패턴https://ko.wikipedia.org/wiki/%EC%8B%B1%EA%B8%80%ED%84%B4_%ED%8C%A8%ED%84%B4
레이스 컨디션https://ko.wikipedia.org/wiki/%EA%B2%BD%EC%9F%81_%EC%83%81%ED%83%9C
https://medium.com/@joongwon/multi-thread-환경에서의-올바른-singleton-578d9511fd42https://medium.com/@joongwon/multi-thread-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C%EC%9D%98-%EC%98%AC%EB%B0%94%EB%A5%B8-singleton-578d9511fd42
Give feedback.https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
JoisFe https://patch-diff.githubusercontent.com/JoisFe
Dec 19, 2022 https://github.com/orgs/Study-2-Effective-Java/discussions/12#discussioncomment-4445631
View full answer https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12#discussioncomment-4445631
Oldest https://patch-diff.githubusercontent.com/orgs/Study-2-Effective-Java/discussions/12?sort=old
Newest https://patch-diff.githubusercontent.com/orgs/Study-2-Effective-Java/discussions/12?sort=new
Top https://patch-diff.githubusercontent.com/orgs/Study-2-Effective-Java/discussions/12?sort=top
Please reload this pagehttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
Please reload this pagehttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
chikeem90 https://patch-diff.githubusercontent.com/chikeem90
Dec 18, 2022 https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12#discussioncomment-4441704
Give feedback.https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
Please reload this pagehttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
Please reload this pagehttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
JoisFe https://patch-diff.githubusercontent.com/JoisFe
Dec 19, 2022 https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12#discussioncomment-4445631
Give feedback.https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
jinan159https://patch-diff.githubusercontent.com/jinan159
Please reload this pagehttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
Please reload this pagehttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
Irisation23 https://patch-diff.githubusercontent.com/Irisation23
Dec 19, 2022 https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12#discussioncomment-4449538
Lazy loading with a holder vs Eager loading without a holderhttps://stackoverflow.com/questions/34506466/singleton-with-or-without-holder-lazy-vs-eager-initialisation
Give feedback.https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
https://patch-diff.githubusercontent.com/Irisation23
Please reload this pagehttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
Please reload this pagehttps://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
Irisation23https://patch-diff.githubusercontent.com/Irisation23
Apr 4, 2023 https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12#discussioncomment-5516181
@jinan159https://github.com/jinan159
https://nesoy.github.io/articles/2018-06/Java-volatilehttps://nesoy.github.io/articles/2018-06/Java-volatile
Give feedback.https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
Sign up for freehttps://patch-diff.githubusercontent.com/join?source=comment-repo
Sign in to commenthttps://patch-diff.githubusercontent.com/login?return_to=https%3A%2F%2Fgithub.com%2Forgs%2FStudy-2-Effective-Java%2Fdiscussions%2F12
📚 3. 과제 https://patch-diff.githubusercontent.com/orgs/Study-2-Effective-Java/discussions/categories/3-%EA%B3%BC%EC%A0%9C
2장 객체 생성과 파괴 https://patch-diff.githubusercontent.com/orgs/Study-2-Effective-Java/discussions?discussions_q=label%3A%222%EC%9E%A5+%EA%B0%9D%EC%B2%B4+%EC%83%9D%EC%84%B1%EA%B3%BC+%ED%8C%8C%EA%B4%B4%22
https://patch-diff.githubusercontent.com/jinan159
https://patch-diff.githubusercontent.com/chikeem90
https://patch-diff.githubusercontent.com/Irisation23
https://patch-diff.githubusercontent.com/JoisFe
https://patch-diff.githubusercontent.com/Study-2-Effective-Java/Effective-Java/discussions/12
https://patch-diff.githubusercontent.com/settings/replies?return_to=1
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.