Tìm hiểu về synchronized

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
2
3
4
5
6
7
class SynchronizedDemo {

@Volatile
@Synchronized
private var index: Int = 0

}
  • Trong ví dụ trên, index được annotate bằng volatile 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 volatilesynchronized để implement Singleton pattern.