informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Pola singleton memastikan bahwa suatu kelas hanya memiliki satu instance, membuat instance dirinya sendiri, dan menyediakan instance ini ke seluruh sistem
Fungsi utama dari pola singleton adalah untuk memastikan bahwa hanya ada satu instance dari suatu kelas
adegan yang akan digunakan:
● Sebagai penghasil nomor seri
● Penghitung halaman Web menghindari penambahan teknologi ke database setiap kali di-refresh dan menyimpannya dalam cache terlebih dahulu.
● Membuat objek yang menggunakan terlalu banyak sumber daya, seperti I/O dan koneksi database, dll.
Ada 7 metode implementasi pola tunggal
Terutama dibagi menjadi gaya Hungry Man dan gaya Lazy Man
Gaya Cina Lapar: Pemuatan kelas akan menyebabkan objek instance tunggal dibuat
Gaya malas: Pemuatan kelas tidak menyebabkan objek instance tunggal dibuat, tetapi dibuat saat objek tersebut digunakan untuk pertama kali.
Berikut ini demonstrasi cara terbaik untuk mengimplementasikan pola singleton: mengimplementasikan pola singleton dalam bentuk enumerasi dan menggunakannya (menerapkan generator nomor seri)
public enum SequenceGenerator {
INSTANCE;
private int sequenceNumber;
// 构造函数,初始化序列号为0
private SequenceGenerator() {
this.sequenceNumber = 0;
}
/**
* 获取下一个序列号。
* @return 下一个序列号
*/
public synchronized int getNextSequenceNumber() {
return sequenceNumber++;
}
}
// 测试类
public class SequenceGeneratorTest {
public static void main(String[] args) {
// 创建一个线程安全的列表来存储生成的序列号
List<Integer> sequenceNumbers = new CopyOnWriteArrayList<>();
// 创建多个线程来测试并发生成序列号
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (int i = 0; i < 1000; i++) {
executorService.submit(() -> {
int seq = SequenceGenerator.INSTANCE.getNextSequenceNumber();
sequenceNumbers.add(seq);
});
}
executorService.shutdown();
try {
executorService.awaitTermination(1, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 输出所有生成的序列号,检查是否有重复
System.out.println(sequenceNumbers);
System.out.println("Total generated sequences: " + sequenceNumbers.size());
}
}
Output yang dihasilkan adalah
Dalam contoh ini, SequenceGenerator adalah kelas enumerasi yang memiliki kolom sequenceNumber pribadi yang digunakan untuk menyimpan nomor urut saat ini. Metode getNextSequenceNumber aman untuk thread karena dinyatakan tersinkronisasi, memastikan konflik nomor urut tidak akan terjadi di lingkungan multi-thread.
Di kelas SequenceGeneratorTest, kami menggunakan ExecutorService untuk mensimulasikan lingkungan bersamaan, dan menggunakan CopyOnWriteArrayList yang aman untuk mengumpulkan nomor urut yang dihasilkan guna memverifikasi kebenaran nomor urut.
Harap perhatikan bahwa meskipun kata kunci tersinkronisasi memastikan keamanan thread, hal ini dapat memengaruhi kinerja dalam skenario konkurensi tinggi. Jika generator nomor urut perlu bekerja dalam konkurensi yang sangat tinggi, Anda mungkin perlu mempertimbangkan algoritma yang lebih efisien, seperti menggunakan variabel atom (seperti AtomicInteger) atau skema pembuatan nomor urut terdistribusi.