Phương thức synchronize của 2 đối tượng

public class T
{
    public synchronized void m()
    {
        ...
    }
    ...
}

Mình có biến t1t2 cùng thuộc kiểu dữ liệu T, vậy 2 thread khác nhau có thể chạy t1.m()t2.m() cùng lúc được không? Hay thread2 phải chờ thread1 chạy t1.m() xong mới gọi t2.m()?

bạn xài hẳn từ khóa synchronized thì 2 thread không thể chạy vào hàm này cùng lúc được.

2 Likes

Như vậy nếu mình muốn 2 thread cùng hoạt động thì mình ko được khoá phương thức mà phải khoá đối tượng đúng không?

public void m()
{
    synchronized(this)
    {
        ...
    }
    ...
}

synchronized của bạn bao bọc chỗ nào thì chỗ đó không chạy đồng thời nhiều nơi (trong cùng process) được.

2 Likes

được, nếu 2 thread k dùng chung cùng 1 đối tượng t

2 Likes

Bạn muốn 2 thread cùng hoạt động thì không khóa làm gì cả? Bạn gọi 2 thread và gọi phương thức start() của nó. Còn nếu đồng bộ hóa phương thức hoặc đối tượng thì có thể thêm keywork synchronized vào phương thức hoặc đối tượng cần đồng bộ :smiley:. Chung class cũng vậy thôi nhỉ :smiley: trừ khi phương thức hoặc đối tượng trong class của bạn đặc biệt (sâu hơn thì mình ko rõ)

1 Like

Nay đọc lại, thấy đúng là hồi đó mình ngu ngơ thật, học trái ngành lại còn lần đầu tiếp xúc với đa luồng chả hiểu gì.

Nay xin tự trả lời lại câu hỏi là: t1t2 là 2 đối tượng khác nhau, 2 đoạn synchronize chả liên quan gì đến nhau, nên việc thread2 chạy t2.m() chả liên quan gì đến thread1 chạy t1.m() cả, câu hỏi ngu si này là do hiểu sai ý nghĩa của synchronized, tưởng là đặt ở method thì nó block cả class :<

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