private volatile Object obj = new MyObject();
void foo()
{
synchronized(obj)
{
obj.doWork();
}
}
void bar()
{
synchronized(obj)
{
obj.doWork();
obj = new MyObject(); // <<<< notice this line (call it line-x)
}
}
Giả sử tại một điểm nhất định trong thời gian, một sợi t_bar
đang thực hiện bar()
, và một số khác t_foo
đang thực hiện foo
, và rằng t_bar
vừa mua obj
, vì vậy t_foo
, trong thực tế, đang chờ đợi.đồng bộ hóa trên đối tượng phi chính thức
Sau khi khối đồng bộ hóa trong bar
được thực thi, foo
sẽ nhận được để thực thi khối đồng bộ hóa của nó, phải không? Giá trị của obj
nó sẽ thấy? Cái cũ? Hoặc bộ mới được đặt trong bar
?
(Tôi sẽ hy vọng rằng giá trị mới được nhìn thấy, đó là toàn bộ điểm của mã hóa nó theo cách đó, nhưng tôi muốn biết nếu điều này là một 'an toàn' đặt cược)
@javapirate: Tôi tìm thấy nó RẤT thô lỗ mà bạn đã chỉnh sửa bài viết của tôi đơn giản chỉ vì bạn thích phong cách định dạng K & R của riêng bạn? Tôi xin lỗi, nhưng tôi sẽ phải định dạng lại nó. –
Xin lỗi. Tôi nghĩ đến việc thoát khỏi rất nhiều không gian trống. Tiếp tục! –
Một sự khác biệt có thể giúp hiểu là * đối tượng * hoặc không phải là cuối cùng hoặc không phải là cuối cùng, biến chứa tham chiếu đến chúng. Khóa nằm trên vật thể, không phải trên biến. –