Lớp Singleton trong Java - Cách sử dụng Lớp Singleton?



Bài viết này về Lớp Singleton trong Java nói về các cách khác nhau mà một lớp có thể được tạo Singleton cùng với các triển khai thực dụng.

Trong Java, một lớp singleton là một lớp chỉ có thể có một thể hiện tại một thời điểm nhất định. Đây là một trong năm mẫu Thiết kế Sáng tạo trong Java giúp phát triển dễ dàng . Thông qua phương tiện của bài viết này, tôi sẽ cung cấp cho bạn những hiểu biết rõ ràng về lớp singleton trong Java là gì và cách bạn có thể tạo nó.

Dưới đây là các chủ đề tôi sẽ đề cập trong bài viết này:





cách tìm số lớn nhất trong mảng java

Bắt đầu nào.

Lớp Singleton trong Java là gì?

Theo thuật ngữ layman, một lớp Singleton trong Java là lớp cho phép truy cập vào nó thông qua một cá thể duy nhất tại một thời điểm. Mẫu thiết kế này là để hạn chế việc tạo ra một lớp không cần thiết và đảm bảo rằng chỉ một lớp tồn tại tại bất kỳ thời điểm nào trên mỗi phiên bản JVM. Do đó, với mẫu này, bất kỳ lớp nào được định nghĩa là Singleton chỉ có một thể hiện duy nhấtvới điểm truy cập toàn cầu. Không giống như các lớp bình thường, một lớp singleton không bị phá hủy khi kết thúc vòng đời ứng dụng.



Nhưng tại sao chúng ta cần một Lớp Singleton ngay từ đầu?

Chà, bằng cách hạn chế việc tạo phiên bản của một lớp, nó sẽ tiết kiệm dung lượng bộ nhớ vì bây giờ đối tượng sẽ không được tạo mỗi khi có yêu cầu mới. Thay vào đó, một đối tượng duy nhất sẽ được sử dụng nhiều lần. Đây là lý do mẫu Singleton trong Java chủ yếu được sử dụng với và các ứng dụng cơ sở dữ liệu. Về cơ bản, nó được sử dụng để ghi nhật ký, lưu vào bộ nhớ đệm, tổng hợp chuỗi, cài đặt cấu hình và nhiều hơn nữa.

Tôi hy vọng bạn đã rõ khái niệm về lớp Singleton trong Java. Vì vậy, bây giờ chúng ta hãy tiến xa hơn trong việc nàyBài viết Singleton Class trong Java và xem chúng được tạo ra như thế nào.



Các cách thiết kế một lớp Java Singleton

Để tạo một singleton lớp trong Java, bạn cần ba điều sau:

  1. thành viên tĩnh của một lớp
  2. nhà xây dựng riêng
  3. phương pháp nhà máy tĩnh

Vì Java cho phép các nhà phát triển khám phá tầm nhìn của họ, nên cómột số cách mà bạn có thể thiết kế một lớp Singleton. Dưới đây tôi đã liệt kê những cái phổ biến nhất.

  1. Phương pháp khởi tạo háo hức
  2. Phương pháp khởi tạo lười biếng
  3. Phương pháp Singleton An toàn Chủ đề
  4. Khởi tạo lười biếng với phương pháp khóa kép
  5. Phương pháp tải lười biếng
  6. Phương pháp khởi tạo khối tĩnh

Bây giờ chúng ta hãy đi sâu hơn vào từng cách tiếp cận này.

1. Phương pháp khởi tạo Eager

Đây là phương pháp đơn giản nhất để tạo một lớp Singleton trong đó cá thể được tạo tại thời điểm tải lớp. Để tạo một lớp singleton bằng phương pháp này, bạn cần làm theo các bước được đề cập bên dưới:

  1. Khai báo phương thức khởi tạo private.
  2. Bước tiếp theo là tạo một thành viên lớp riêng cho lớp Singleton này.
  3. Bây giờ, bạn cần xác định một phương thức gốc sẽ được sử dụng để trả về đối tượng của lớp bạn, mà chúng ta đã tạo như một thể hiện của thành viên lớp.
  4. Bạn thậm chí có thể khai báo một thành viên tĩnh public nếu bạn muốn truy cập trực tiếp vào trường hợp tĩnh này.

Bây giờ, hãy xem cách triển khai những điều này.

// Khởi tạo Eager public class EagerSingleton {private static final EagerSingleton INSTANCE = new EagerSingleton () private EagerSingleton () {} public static EagerSingleton getInstance () {return INSTANCE}}

Nếu bạn nhìn thấy mã, bạn có thể thấy rằng mỗi khi chúng tôi khởi tạo một đối tượng, chúng tôi đang sử dụnggetInstance ()thay vì gọi lớp người xây dựng .Nhưng nó có những nhược điểm riêng. Nếu bạn sử dụng phương pháp này để tạo một lớp đơn, thì một thể hiện sẽ được tạo bất kể ứng dụng có đang sử dụng nó hay không.

Vì vậy, hãy tiếp tục và xem một cách khác để tạo một lớp singleton trong Java.

2. Phương pháp khởi tạo lười biếng

Phương thức này được gọi là khởi tạo lười biếng vì nó trì hoãn việc tạo cá thể lớp cho đến lần sử dụng đầu tiên. Ý tôi là, với phương pháp này, một đối tượng chỉ được tạo ra khi nó cần thiết. Nó giúp tránh việc tạo ra . Để thiết kế một lớp singleton theo cách này, bạn cần thực hiện theo các bước được liệt kê dưới đây:

  1. Trước hết, khai báo hàm tạo là private.
  2. Sau đó, bạn cần tạo một cá thể tĩnh riêng tư cho lớp này nhưng chưa cần khởi tạo nó.
  3. Cuối cùng, tạo một phương thức gốc sẽ kiểm tra xem thành viên thể hiện có phải là null hay không. Nếu không, nó sẽ tạo một thể hiện của lớp singleton cho bạn và trả về nó.

Đoạn mã dưới đây cho thấy cách thực hiện điều này.

// Khởi tạo Lazy public class LazySingleton {private static LazySingleton INSTANCE = null private LazySingleton () {} public static LazySingleton getInstance () {if (INSTANCE == null) {sync (LazySingleton.class) {INSTANCE = new LazySingleton ()}} trả lại INSTANCE}}

3. Thread Safe Singleton phương pháp

Nhưng cách tiếp cận trên có thể gây ra một số lo ngại trong các kịch bản đồng thời. Vì mô hình singleton chủ yếu được sử dụng với nhiều luồng và nếunhiều luồng nhập điều kiện if cùng một lúc, nó có thể gây ra vấn đề. Để tránh điều này, chúng tôi cố gắng tạo một lớp singleton an toàn cho luồng bằng cách làm cho phương thức truy cập toàn cục được đồng bộ hóa. Điều này đảm bảo rằng chỉ có một luồng đang thực thi phương thức này tại bất kỳ thời điểm nào. Tham khảo đoạn mã dưới đây để xem cách triển khai:

// Thread Safe Singleton public class ThreadSafeSingleton {private static ThreadSafeSingleton INSTANCE private ThreadSafeSingleton () {} public static sync ThreadSafeSingleton getInstance () {if (INSTANCE == null) {INSTANCE = new ThreadSafeSingleton ()} return INSTANCE}}

Nhưng đôi khi cách tiếp cận này cũng có thể trở nên rất rườm rà vì mỗi lần phương phápđược gọi, nó cần phải đợi khóa được giải phóng trước khi phương thức có thể sử dụng nó. Điều này dẫn đến việc làm chậm quá trình và đưa chúng ta đến cách tiếp cận tiếp theo đó làKhởi tạo Lazy với Double Lock.

4. Khởi tạo Lazy với Double Lock phương pháp

Trong cách tiếp cận này, chúng tôi không đồng bộ hóa các phương pháp. Thay vào đó, chúng tôi bao bọc mã tạo đối tượng trong một khối được đồng bộ hóa.Bạn có thể nói rằng bằng cách kiểm tra các khóa ren trước, nógiảm số lần mua lại khóa. Cách tiếp cận này thường dẫn đến việc tăng hiệu suất của ứng dụng. Kiểm tra đoạn mã dưới đây để xem nó được thực hiện như thế nào.

dịch vụ ngay bây giờ hướng dẫn công cụ bán vé
// Khởi tạo Lazy với Double Lock public class LazyDoubleLockSingleton {private static LazyDoubleLockSingleton INSTANCE = null private LazyDoubleLockSingleton () {} public static LazyDoubleLockSingleton getInstance () {if (INSTANCE INSTANCE == null) {sync (Lazyleton. if null) {INSTANCE = new LazyDoubleLockSingleton ()}}} trả về INSTANCE}}

5. Phương pháp tải lười biếng

Phương pháp này dựa trên JSL (Đặc tả ngôn ngữ Java) và theo sẽ chỉ tải các thành viên dữ liệu tĩnh khi chúng được yêu cầu. Vì vậy, khi lớp singleton của bạn được tải vào JVM, không có cá thể nào được tạo. Hơn nữa, trong quá trình thực thi chương trình, phương thức toàn cục được gọi theo thứ tự tuần tự. Với phương pháp này, bạn không cần phải đồng bộ hóa rõ ràng hàm getInstance () để tải và khởi tạo. Thành viên lớp tĩnh sẽ được gọi theo trình tự thích hợp, phần còn lại của các lệnh gọi đồng thời của phương thức toàn cục được trả về theo thứ tự mà không cần thực hiện chi phí đồng bộ hóa.

Dưới đây là mã để thực hiện tương tự.

// Lazy Load Method public class LazyLoadSingleton {private LazyLoadSingleton () {} private static class SingletonClassHolder {static final Var INSTANCE = new LazyLoadSingleton ()} public static LazyLoadSingleton getInstance () {return SingletonClassHolder.INSTANCE}}

6. Phương pháp khởi tạo khối tĩnh

Phương pháp tạo một lớp singleton trong Java này làtương tự như phương thức khởi tạo háo hức. Sự khác biệt duy nhất là thể hiện cho lớp này được tạo trong khối tĩnh có chức năng.

// Khởi tạo khối tĩnh public class StaticBlockSingleton {private static StaticBlockSingleton INSTANCE private StaticBlockSingleton () {} // xử lý ngoại lệ trong khối static static {try {INSTANCE = new StaticBlockSingleton ()} catch (Exception e) {ném new RuntimeException ('Exception xảy ra trong khi tạo một Lớp Singleton ')}} public static StaticBlockSingleton getInstance () {return INSTANCE}}

Chúng ta đến phần cuối của bài viết này về lớp Singleton trong Java. Nếu bạn muốn biết thêm về Java, bạn có thể tham khảo .

Bây giờ bạn đã hiểu lớp Singleton trong Java là gì, hãy xem của Edureka, một công ty học trực tuyến đáng tin cậy với mạng lưới hơn 250.000 người học hài lòng trải dài trên toàn cầu. Khóa đào tạo và cấp chứng chỉ về Java J2EE và SOA của Edureka được thiết kế cho sinh viên và các chuyên gia muốn trở thành Nhà phát triển Java. Khóa học được thiết kế để cung cấp cho bạn khởi đầu về lập trình Java và đào tạo bạn về cả khái niệm Java cốt lõi và nâng cao cùng với các khung Java khác nhau như Hibernate & Spring.

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến nó trong phần nhận xét của bài viết “Lớp Singleton trong Java” này và chúng tôi sẽ liên hệ lại với bạn trong thời gian sớm nhất.