Synchorized trong Java

Xin chào mọi người, mình có vài thắc mắc về cơ chế đồng bộ trong java, mong mọi người giúp đỡ.

  1. Khi synchrorized một object, thì tất cả các luồng khác sử dụng object đó có phải đều phải đợi xong đoạn code được synchorized mới được dùng tiếp object đó có đúng không ạ?

  2. Khi synchrorized một method, ví dụ count(Object object) và mình có 2 luồng t1 : count(Object a) và t2 : count(Object b) thì t2 có cần phải đợi t1.count tính xong thì mới được tính không?

  3. Khi thực hiện thay đổi dữ liệu dùng chung trong db trong một method được synchronized, thì những luồng khác sử dụng dữ liệu đó sẽ cần phải get lại dữ liệu đó để lấy lại được dữ liệu mới nhất đúng không ạ?

Mong mọi người giúp đỡ, mình xin chân thành cảm ơn.

1 Like

Hi there,

Để tớ thử trả lời câu hỏi của cậu.

Tớ đoán cậu đang nói tới ví dụ này:

public void something() {
  synchronize(this) {
    // synchronize code goes here
  }
}

Ở ví dụ này, tất cả các thread gọi tới something của cùng 1 object sẽ được synchronize, hay nói cách khác, đoạn synchronize code goes here sẽ được thực hiện lần lượt.
Tuy nhiên, object this vẫn có thể được sử dụng ở các chỗ khác như thường :smile: Chỉ chỗ nào được synchronize với this, các thread mới phải thực hiện tuần tự.
Cậu có thể tự test điều đó ở nhà :smile:

Có, thread 2 sẽ phải đợi thread 1 thực thi xong method count, với các điều kiện dưới đây:

  • 2 Threads đều dùng chung 1 object để gọi method count()
  • Thread 1 tới trước thread 2 khi gọi method count()

Câu hỏi này hơi tối nghĩa, vì dữ liệu dùng chung trong DB ở đây là dữ liệu trong DB (nơi mà java synchronization không với tới), hay dữ liệu sau khi lấy từ DB về và lưu nó trong 1 object nào đó?
Nếu ý cậu là dữ liệu sau khi lấy từ DB về và lưu nó trong 1 object nào đó, cái này thì có thể liên quan tới Java synchronization, tuy nhiên, tất cả các nơi sử dụng dữ liệu này nên có reference của dữ liệu. Điều đó có nghĩa là dữ liệu bị thay đổi -> tất cả mọi nơi sử dụng cũng nên được thay đổi chứ?

Để chắc chắn tớ hiểu đúng ý cậu, cậu có thể cho tớ code demo không? :smile:

4 Likes

Bác hiểu đúng ý mình rồi á, Cảm ơn bác nhiều lắm <3

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?