01/10/2018, 11:21

Hỏi phương thức đồng bộ static trong java

Em hiểu và sử dụng tốt synchronized cho các phương thức thường. nhưng có 1 vấn đề đó là Phương thức đồng bộ static thì e k hiểu rõ cơ chế của nó, anh chị nào cho e 1 ví dụ cụ thể, để e hiểu rõ phương thức có từ khóa static ko ạ.

Phạm Vinh viết 13:27 ngày 01/10/2018

Phương thức có từ khóa static tức là nó chỉ đứng riêng một mình, không liên quan gì đến object. Khi gọi hàm thì thường phải tạo object của hàm đó rồi mới gọi được hàm, nhưng static cho phép bỏ qua việc tạo object.
Tuy nhiên phương thức static chỉ có thể tác động đến các thuộc tính/hàm static trong class.


class MyClass{
   public static foo(){
   //code
   } 
}

// Khi cần gọi foo thì chỉ cần MyClass.foo 

Hàm static thường dùng để tạo các hàm đa dụng
Vd:

Math.sqrt();

Hàm đồng bộ static có cơ chế đồng bộ như thường (là khi 1 thread yêu cầu gọi hàm, nó sẽ đc phát cho 1 cái lock và sẽ thả lock này ra khi xong việc). Có điều lock của hàm static sẽ là 1 object riêng biệt (hàm thường thì lock sẽ là instant của class)
Không biết mình giải thích đúng vấn đề của bạn chưa?

toiyeulaptrinh viết 13:23 ngày 01/10/2018

mình có 1 đoạn lý thuyết thế này, bạn giúp mình hiểu rõ đoạn này xem nhé, mình thật sự k hiểu đoạn này nè :

Vấn đề khi không sử dụng phương thức đồng bộ static

Giả sử có hai đối tượng của một lớp được chia sẻ (ví dụ: Table) có tên object1 và object2. Trong trường hợp phương thức đồng bộ và khối đồng bộ không thể can thiệp giữa t1 và t2 hoặc t3 và t4 vì t1 và t2 đều tham chiếu đến một đối tượng chung có một khóa duy nhất. Nhưng có thể có sự va chạm giữa t1 và t3 hoặc t2 và t4 bởi vì t1 lấy được một khóa khác và t3 có được một khóa khác. Tôi không muốn sự xen vào giữa t1 và t3 hoặc t2 và t4. Phương thức đồng bộ hóa static được sử dụng để giải quyết vấn đề này.

Phạm Vinh viết 13:24 ngày 01/10/2018

À. Khi bạn có 1 class chia sẻ (table, có thể lưu trữ các thông tin nhân viên, việc làm,vv). Tưởng tượng cái class cơ sở dữ liệu(csdl) đó là 1 căn phòng. Muốn truy cập thông tin thì phải đi qua cửa lần lượt. Nhưng mỗi lần tạo 1 object của class csdl thì bạn vô tình tạo thêm 1 cửa. 2 thằng phía trước cửa thì phải vô lần lượt. Nhưng thằng xài cửa sau thì vẫn có thể vô cùng lúc với thằng cửa trước =>không đồng bộ. Vì vậy, như mình đã nói ở trên

Có điều lock của hàm static sẽ là 1 object riêng biệt (hàm thường thì lock sẽ là instant của class)

Có nghĩa là dù có bao nhiêu object đi nữa thì vẫn chỉ gọi đúng có 1 hàm static, một căn phòng và 1 cửa=> éo có cửa sau

toiyeulaptrinh viết 13:28 ngày 01/10/2018

bạn ví dụ rất hay.dễ hiểu quá. cuối cùng mình hiểu thế này. bạn xem mình hiểu đúng ko nhé. bình thường, hàm đồng bộ mà ko có static. nếu tạo nhiều object. nghĩa sẽ tạo ra nhiều cửa vào, và dẫn tới,nhiều luồng vào 1 lúc. Nhưng khi thêm từ khóa static vào, thì dù tạo bao nhiêu object đi nữa, vẩn chỉ là 1 cửa. và các luồng phải lần lượt vào.(Không có cửa khác dù tạo nhiều object )

Phạm Vinh viết 13:28 ngày 01/10/2018

Chuẩn rồi đấy, vì static là 1 và chỉ có một.
Nếu bạn muốn hiểu sâu hơn (về vấn đề kỹ thuật) và không ngại TA thì có thể lên trang của Oracle đọc. Kiếm từ khóa “java synchronized”

toiyeulaptrinh viết 13:23 ngày 01/10/2018

“”" Có điều lock của hàm static sẽ là 1 object riêng biệt (hàm thường thì lock sẽ là instant của class)""
À. có chổ này. bạn có thể cho mình 2 đoạn code. để phân biệt rõ giữa 2 cái này ko

Phạm Vinh viết 13:30 ngày 01/10/2018

Chứng minh thì hơi khó nhưng hệ quả bạn thấy rồi đấy(căn phòng và cánh cửa).
Để có thể đảm bảo sự đồng bộ thì các thread khi truy cập hàm đồng bộ thì phải giữ một object (hay được gọi là intrinsic lock) được cấp phát mới có thể truy cập. Thì hàm đồng bộ thông thường cho tiện thì object đó chính là object dùng để gọi hàm.

Nhưng static thì khác, chúng là duy nhất, nó không thuộc object nào cả. lưu ý là duy nhất này khác với định nghĩa của hằng (hằng là không thay đổi). vậy nên không thể áp dụng như ở trên mà lock của nó phải là riêng biệt (sẽ thật tệ nếu có 1 cái cửa mà chìa khóa nào cũng mở được).

Hơi mang tính hàn lâm nên đây là phiên bản ngắn gọn:
Vẫn căn phòng và cánh cửa thì để đảm bảo mỗi thằng phải vô lần lượt thì trước căn phòng sẽ có 1 ông bảo vệ. Nếu ai (thread) muốn vô cửa bị khóa (hàm đồng bộ) thì phải hỏi xin chìa khóa (intrinsic lock) từ thằng bảo vệ. Vậy nếu bạn lỡ xây 2 cửa(có 2 object) => 2 chìa khóa đến 2 cửa khác nhau nhưng ở cùng 1 phòng (Vì thằng bảo vệ bị ngu nên nó không biết điều đó). Nhưng nếu ta nói với thằng bảo vệ:“ĐM!! Tao cắt lương m…” à nhầm “Ở đây muốn vô phòng này thì chỉ có 1 cửa duy nhất thôi(static synchronized method), nên ai muốn vô thì đưa nó cái chìa khóa này”=> ez game ez life
Bạn bắt kịp chứ?

toiyeulaptrinh viết 13:22 ngày 01/10/2018

mình đã hiểu, thật sự cảm ơn, sự giúp đở của bạn, k có những ví dụ thực tế của bạn, mình chả biết hiểu thế nào, mình đã hình dung ra nó, chỉ cần nghiền ngẫm thêm là oke. cảm ơn bạn rất rất nhiều

Bài liên quan
0