Singleton Design Pattern: Code và chống lỗi cho multi threading

  Рет қаралды 11,233

Ông Dev

Ông Dev

Күн бұрын

Hế lô hế lô, Ông dev đây!
Trong phần này mình sẽ tiến hành implement Singleton Design pattern và giải quyết vấn đề multi threading khi sử dụng Lazy initialization nhé.
Tóm tắt:
- Implement private static property
- Implement private constructor
- Implement public static getInstance method
- Mình đã tiến hành cả 2 cách khởi tạo Singleton trong phần code bao gồm:
+ Khởi tạo thẳng vào static property
+ Khởi tạo khi gọi getInstance lần đầu tiên
- Giải quyết vấn đề đa luồng khi khởi tạo ở lần gọi getInstance đầu tiên:
** Vấn đề 1: Các thread chạy cùng lần để khởi tạo instance thì sẽ tạo ra nhiều instance thay vì một và chỉ một.
-- Cách giải quyết: sử dụng lock object( nếu dùng Java thì dùng từ khoá synchronized) thì sẽ khiến các thread khác chờ cho một thread chạy xong getInstance. Nhờ vậy sẽ không xảy ra việc bị khởi tạo nhiều instance.
** Vấn đề 2: Performance sẽ giảm khi chúng ta đồng bộ hoá hàm getInstance vì tất cả các thread gọi lấy instance cùng lần đều phải chờ.
-- Cách giải quyết: Check null (để biết là có instance hay chưa), nếu chưa thì mới khoá hàm lại và khởi tạo, còn không thì return ra instance đã có. Nhờ vậy các thread sẽ không cần phải đợi nếu instance đã được khởi tạo.
- Các vấn đề về đa luồng chỉ xảy ra khi chúng ta sử dụng cách khởi tạo ở lần gọi đầu tiên(lazy initialization).
- Các bạn có thể tìm hiểu từ khoá VOLATILE: khi sử dụng thì hệ thống sẽ lọc ra giá trị mới nhất của biến để sử dụng(ứng dụng rất tốt khi làm việc đa luồng).
Bạn có thể xem các phần trước ở đây:
-Phân tích, trường hợp áp dụng: • Singleton Design Patte...
-Class diagram, các vấn đề về đa luồng: • Singleton Design Patte...
Link của cả playlist design pattern:
• Design Pattern
Source code: github.com/Mil...
-- Để xem những video về lập trình và gaming --
Nhấn vào đây để theo dõi kênh mình nhé: duyngd.com/Sub...
-- Blog của mình --
duyngd.com
-- Facebook page của mình --
/ ongdevvuitinh
-- Ủng hộ Ông Dev --
Cảm ơn các bạn đã quan tâm theo dõi
#Ôngdev #Singleton #DesignPattern

Пікірлер: 21
@ucmanhly8404
@ucmanhly8404 3 жыл бұрын
hay quá anh. series này em xem hoài không chán luôn. mà cho em hỏi việc new 1 Object bỏ vào lock như vậy cách hoạt động của nó là như nào. có thể thay bằng bất kỳ Object khác được không
@kietnguyentuan357
@kietnguyentuan357 3 жыл бұрын
Thích Ông Dev r nhé. video xịn xò
@hunglekim8279
@hunglekim8279 3 жыл бұрын
Thanks, thêm video về design pattern đi ông Dev :3
@hieptrinh118
@hieptrinh118 Жыл бұрын
anh cho em hỏi phút thứ 14:00 dòng 17 check null dòng 21 cung check null nữa có dư ko ạ
@phamucmanh1750
@phamucmanh1750 2 жыл бұрын
Anh ơi em xin hỏi ở 1 số ngôn ngữ như C# có hỗ trợ Lazy khi khởi tạo thuộc tính trong class, theo em được biết thì nó Thread-safe. Mình có thể sử dụng nó để giải quyết vấn đề trong Singleton hay không: - Khi sử dụng mới khởi tạo để tối ưu bộ nhớ - An toàn luồng khi khởi tạo và truy suất Em cảm ơn ạ !
2 жыл бұрын
Đc á e, cơ chế trong video này cũng tương tự á
@phamucmanh1750
@phamucmanh1750 2 жыл бұрын
@ Cảm ơn anh ạ, kênh nhiều video hữu ích như gãi đúng chỗ ngứa của em vậy
@thinguyen-uj6sk
@thinguyen-uj6sk Жыл бұрын
a cho e hỏi là multiple thread cùng gọi cùng lúc nhưng sao lại có thằng chạy được lock và thằng phải đợi vậy a.😅
@HuyNguyen-kw9hx
@HuyNguyen-kw9hx 4 жыл бұрын
cam on ban ,bên java có một method là hasCode() dùng cái này để so sánh nó có cùng 1 object hay ko, hoac dung "==" luon,cách synchronize bên java khá giống vs cái block có lock kia, tuy nhiên dùng sẽ giảm performace co thay thể bằng nested class, có thể phá vỡ singleton bằng kỹ thuật refection, và singleton ko có tác dụng trong serialation .
4 жыл бұрын
C# cũng có getHashCode(). Static nested sẽ là cách tối ưu nhất và được dùng nhiều nhất. Còn về synchronized, nếu thả nó ở getInstance thì sẽ làm tụt performance, nhưng nếu để nó vào bên trong check instance==null thì nó sẽ chỉ ảnh hưởng performance ở lần đầu tiên. Dù sao thì static nested class vẫn là tối ưu nhất.
@doanhthuc3031
@doanhthuc3031 3 жыл бұрын
anh cho em hỏi serialization có ý nghĩa gì ạ?
@tranhay6000
@tranhay6000 5 жыл бұрын
Video quá chất lượng, mong anh ra nhiều chủ đề hơn
@lido416
@lido416 Жыл бұрын
Hay quá a
@khangtran938
@khangtran938 4 жыл бұрын
Anh ơi, private static là ntn v a, nếu là là static thì mình có thể truy cập được trực tiếp từ Class mà không cần khởi tạo instance cho nó. Nhưng khi gán private cho nó thì làm sao có thể truy cập được ạ, em thấy hơi mâu thuẫn chưa hiểu rõ lắm?
4 жыл бұрын
Cái instance đó anh sẽ chỉ gọi ở trong class Singleton thôi. Còn ở ngoài chúng ta sẽ sử dụng hàm GetInstance. Và tại sao nó lại là static, vì nếu em sử dụng static, em sẽ không cần viết get, set cho nó :D Nếu muốn nó là CONSTANTS thì chúng ta có thể dùng private static readonly
@hoannnhi3477
@hoannnhi3477 3 жыл бұрын
tại sao lại phải check uniqueInstance = null 2 lần vậy anh? Em thử bỏ uniqueInstance ở trong thì nó vẫn tạo ra 2 cái instance khác nhau
3 жыл бұрын
2 thằng chạy song song, khi nó vào function thì cả 2 check uniqueInstance đều null. => Vượt qua đc if. => 1 thằng lock lại, tạo instance => sau khi hết lock, thằng còn lại đi vào trong lock => nếu ở đây không check null => tạo instance mới.
@HoaNguyen-kn4ci
@HoaNguyen-kn4ci 2 жыл бұрын
Tại sao mình không dùng static final thay vì dùng Singleton vậy a ? Mong a giải thích rõ cho e. E cảm ơn a nhiều ạ ! public static final MyClass instance = new MyClass(); private MyClass(){}
2 жыл бұрын
Cái này a có giải thích ở 1 trong 3 video về singleton rồi, e check thử nha
@HoaNguyen-kn4ci
@HoaNguyen-kn4ci 2 жыл бұрын
@ Vâng. Mong a ra thêm video về design pattern nữa ạ :))
@MinhNguyen-ft3yz
@MinhNguyen-ft3yz Жыл бұрын
cc
Decorator Design Pattern: Phân tích và ví dụ
9:22
Ông Dev
Рет қаралды 11 М.
JWT vs Session - Cuộc Chiến Bất Tận ⚔️ | Ai Mới Là Kẻ Chiến Thắng?
2:28
LetDiv - Học Lập Trình Đảm Bảo
Рет қаралды 757
Пришёл к другу на ночёвку 😂
01:00
Cadrol&Fatich
Рет қаралды 11 МЛН
Стойкость Фёдора поразила всех!
00:58
МИНУС БАЛЛ
Рет қаралды 4,2 МЛН
WORLD BEST MAGIC SECRETS
00:50
MasomkaMagic
Рет қаралды 55 МЛН
54. Hàm bạn (Friend function) trong C++
7:20
F8 Official
Рет қаралды 4,6 М.
Strategy Design Pattern: Phân tích vấn đề
16:37
Ông Dev
Рет қаралды 29 М.
Adapter design pattern | Code là dễ :D | C#
15:45
Ông Dev
Рет қаралды 11 М.
Singleton Design Pattern in C# - Do it THAT way
13:15
tutorialsEU - C#
Рет қаралды 27 М.
API là gì? Tìm hiểu về API
30:28
TechNewLife
Рет қаралды 108
Strategy Design Pattern: Áp dụng vào code (C#)
26:52
Ông Dev
Рет қаралды 16 М.
Facade design pattern | Code là dễ :D | Java
13:31
Ông Dev
Рет қаралды 14 М.
Nhập môn Design Pattern siêu tốc trong 10 phút
10:00
Phạm Huy Hoàng
Рет қаралды 122 М.
Dependency Injection, The Best Pattern
13:16
CodeAesthetic
Рет қаралды 826 М.
Пришёл к другу на ночёвку 😂
01:00
Cadrol&Fatich
Рет қаралды 11 МЛН