Chatbox

Các bạn vui lòng dùng từ ngữ lịch sự và có văn hóa,sử dụng Tiếng Việt có dấu chuẩn. Chúc các bạn vui vẻ!
05/01/2013 10:01 # 1
vnttqb
Cấp độ: 13 - Kỹ năng: 8

Kinh nghiệm: 5/130 (4%)
Kĩ năng: 39/80 (49%)
Ngày gia nhập: 21/03/2011
Bài gởi: 785
Được cảm ơn: 319
[Tutorial] Đồng bộ hóa trong Java


 

Bây giờ chúng ta sẽ tìm hiểu đồng bộ hóa trong Java với từ khóa synchronized.

Synchronized methods

Giả sử chồng và vợ có 2 cái thẻ ATM. Hai người cùng rút một số tiền nhất định vào cùng một thời điểm, sau khi rút tiền máy ATM hiển thị kết quả ngược lại so với mong muốn.

Như vậy số tiền kia bay đi đâu rồi! Ai sẽ chịu trách nhiệm đây? (Chắc là ngân hàng) :D

Minh họa cho sự cố này:

Hình trên tôi cố tình chạy hai tiến trình vào cùng một thời điểm, cùng với việc trừ 1000$ salary trong tài khoản. Tôi sử dụng thêm phương thức getName() để biết được chính xác tên của Thread hiện tại. Và được kết quả:

Tài khoản salary của gia đình là $2000, mà vợ rút $1000 thì phải còn $1000 nhưng còn lại $0. Nguyên nhân do Thread của vợ đang rút $1000 thì Thread của chồng cũng rút $1000 vào cùng thời điểm đó dẫn đến bất đồng bộ.

Và để giả quyết vấn đề trên ta chỉ cần thêm từ khóa synchronized vào trước kiểu giá trị trả về của phương thức là đủ. Minh họa hình dưới:

Mục đích của chính của synchronized là khi đã có một tiến trình A sử dụng tài nguyên này rồi thì những tiến trình khác phải chờ đến khi tiến trình A kết thúc thì mới được phép sử dụng. Kết quả:

Như vậy tiến trình của người chồng phải chờ tiến trình người vợ kết thúc mới được phép sử dụng tài nguyên, đồng nghĩa với việc thời gian xử lý sẽ tăng lên gấp đôi (do phải chờ tiến trình trước kết thúc) nhưng điều này đảm bảo rằng dữ liệu luôn luôn được toàn vẹn.


Synchronized block

Thay vì sử dụng synchronized một phương thức như ở trên thì chúng ta cũng có thể synchronized một đoạn nhỏ trong phương thức của một đối tượng bằng cách sử dụng synchronized block, minh họa hình dưới:

Ở hình trên tôi đã đánh dấu khối được synchronized, các bạn để ý bên cạnh từ khóa synchronized sẽ có cấu trúc "<TênClass.Class>" như trong trường hợp này sẽ là mThread.Class hoặc đơn giản hơn bạn thay thế bằng từ khóa this cũng được, mục đích của từ khóa đó dùng để chỉ rõ đối tượng đối tượng hiện tại sẽ được synchronized và tôi vừa thêm một dòng thông báo "đăng xuất [X]" để xem chuyện gì sẽ xảy ra, kết quả:

Như vậy tiến trình người vợ sau khi thực hiện xong khối lệnh được synchronized thì sẽ nhường quyền cho tiến trình người chồng thực hiện mà không hề ép tiến trình người chồng chờ đợi thêm.

Như vậy với cách trên chúng ta cũng có thể synchronized một đối tượng khác mà thread hiện tại đang nắm giữ với cú pháp như sau:

Object obj = new Object();
  ...

synchronized (obj) {  // in a method
  
... // nội dung
}

Đến đây xem như kết thúc phần đồng bộ hóa trong Java.

Thanks for reading!



======================================================================================================

Cuộc đời là một dòng sông. Ai không bơi thì chết. 
 

Name: Tien (Tory) TRAN
Email: TranTien29@gmail.com


 
Các thành viên đã Thank vnttqb vì Bài viết có ích:
09/01/2013 22:01 # 2
tansvdt
Cấp độ: 3 - Kỹ năng: 1

Kinh nghiệm: 6/30 (20%)
Kĩ năng: 5/10 (50%)
Ngày gia nhập: 31/08/2010
Bài gởi: 36
Được cảm ơn: 5
Phản hồi: [Tutorial] Đồng bộ hóa trong Java


Bài viết chất lượng thế này mà không ai THANK bác ấy à. Thôi tui mở hàng vậy. 




 
09/01/2013 22:01 # 3
vnttqb
Cấp độ: 13 - Kỹ năng: 8

Kinh nghiệm: 5/130 (4%)
Kĩ năng: 39/80 (49%)
Ngày gia nhập: 21/03/2011
Bài gởi: 785
Được cảm ơn: 319
Phản hồi: [Tutorial] Đồng bộ hóa trong Java


Cảm ơn bạn!



======================================================================================================

Cuộc đời là một dòng sông. Ai không bơi thì chết. 
 

Name: Tien (Tory) TRAN
Email: TranTien29@gmail.com


 
07/04/2013 18:04 # 4
hungdam_tn88
Cấp độ: 1 - Kỹ năng: 1

Kinh nghiệm: 1/10 (10%)
Kĩ năng: 1/10 (10%)
Ngày gia nhập: 07/04/2013
Bài gởi: 1
Được cảm ơn: 1
Phản hồi: [Tutorial] Đồng bộ hóa trong Java


Bài viết của bạn quá chất lượng, quá dễ hiểu. Thank bạn !



Kí cái cho nó máu


 
Các thành viên đã Thank hungdam_tn88 vì Bài viết có ích:
21/05/2013 18:05 # 5
shinichi_conan
Cấp độ: 1 - Kỹ năng: 1

Kinh nghiệm: 1/10 (10%)
Kĩ năng: 0/10 (0%)
Ngày gia nhập: 21/05/2013
Bài gởi: 1
Được cảm ơn: 0
Phản hồi: [Tutorial] Đồng bộ hóa trong Java


Các hình minh họa bị die hết rồi kìa bạn




 
Copyright© Đại học Duy Tân 2010 - 2022