I, Lời mở đầu
- Nếu bạn chưa đọc về volatile, mình khuyên bạn nên tìm hiểu trước về keyword này trước.
- Trong Java/kotlin, chúng ta có thể đã sử dụng qua
synchronized
keyword. - Vâỵ thực sự nó có ý nghĩa gì và thường áp dụng vào trong trường hợp nào ? Hôm nay mình sẽ nói cụ thể hơn về keyword này.
II, Ý nghĩa và use cases
- Cớ chế
synchronized
có thể được sử dụng như synchronized() function hay Synchronized annotation. - Trong multiple thread application, việc đọc và ghi có thể bị cản trở bởi 1 vài lý do như switching, file handler…
- Cơ chế synchronized đâm bảo rằng việc đọc và viết các variable, object hay thực hiện các function không bị cản trở.
- Trong Sun document, họ cũng đã nói rõ về keyword này:
synchronized methods enable a simple strategy for preventing thread interference and memory consistency errors: if an object is visible to more than one thread, all reads or writes to that object’s variables are done through synchronized methods.
- Ví dụ:
1 | class SynchronizedDemo { |
- Trong ví dụ trên,
index
được annotate bằngvolatile
keyword có nghĩa làindex
sẽ visible với các Thread dùng tới nó. - Nhưng không có gì đảo rằng việc đọc và ghi
index
trên các Thread khác nhau không bị cản trở và có thể bị error. - Khi bạn sử dụng
@Synchronized
annotation, nó sẽ đảm bảo các cản trở đó sẽ không bị diễn ra. Do đó nó sẽ an toàn (thread-safe) khi sử dụng multiple thread. - Mình hay kết hợp
volatile
vàsynchronized
để implement Singleton pattern.