Tôi vừa tạo một phương thức singleton và tôi muốn biết chức năng @synchronized()
này làm gì, vì tôi sử dụng nó thường xuyên, nhưng không biết ý nghĩa.
Câu trả lời:
Nó khai báo một phần quan trọng xung quanh khối mã. Trong mã đa luồng, @synchronized
đảm bảo rằng chỉ một luồng có thể thực thi mã đó trong khối tại bất kỳ thời điểm nào.
Nếu bạn không biết nó làm gì, thì ứng dụng của bạn có thể không đa luồng và bạn có thể không cần sử dụng nó (đặc biệt nếu bản thân singleton không an toàn theo luồng).
Chỉnh sửa: Thêm một số thông tin khác không có trong câu trả lời ban đầu từ năm 2011.
Các @synchronized
chỉ thị ngăn chặn nhiều chủ đề từ khi vào bất kỳ vùng mã được bảo vệ bởi một @synchronized
chỉ thị đề cập đến cùng một đối tượng . Đối tượng được truyền cho @synchronized
chỉ thị là đối tượng được sử dụng làm "khóa". Hai luồng có thể nằm trong cùng một vùng mã được bảo vệ nếu một đối tượng khác được sử dụng làm khóa và bạn cũng có thể bảo vệ hai vùng mã hoàn toàn khác nhau bằng cách sử dụng cùng một đối tượng làm khóa.
Ngoài ra, nếu bạn tình cờ vượt qua nil
với tư cách là đối tượng khóa, sẽ không có khóa nào được thực hiện.
@synchronized
.
Từ tài liệu của Apple tại đây và đây :
Chỉ thị @synchronized là một cách thuận tiện để tạo khóa mutex nhanh chóng trong mã Objective-C. Lệnh @synchronized thực hiện những gì mà bất kỳ khóa mutex nào khác sẽ làm — nó ngăn các luồng khác nhau có được cùng một khóa cùng một lúc.
Tài liệu cung cấp nhiều thông tin về chủ đề này. Bạn nên dành thời gian để đọc qua nó, đặc biệt là khi bạn đang sử dụng nó mà không biết nó đang làm gì.
Lệnh @synchronized
là một cách thuận tiện để tạo khóa mutex một cách nhanh chóng trong mã Objective-C .
Lệnh @synchronized
này thực hiện những gì mà bất kỳ khóa mutex nào khác sẽ làm — nó ngăn các luồng khác nhau có được cùng một khóa cùng một lúc.
Cú pháp:
@synchronized(key)
{
// thread-safe code
}
Thí dụ:
-(void)AppendExisting:(NSString*)val
{
@synchronized (oldValue) {
[oldValue stringByAppendingFormat:@"-%@",val];
}
}
Bây giờ mã trên hoàn toàn an toàn cho chủ đề..Bây giờ nhiều luồng có thể thay đổi giá trị.
Trên đây chỉ là một ví dụ khó hiểu ...
@synchronized(val, oldValue) { ... }
?
@synchronized block tự động xử lý khóa và mở khóa cho bạn . @synchronize bạn có một khóa ngầm được liên kết với đối tượng bạn đang sử dụng để đồng bộ hóa. Đây là cuộc thảo luận rất nhiều thông tin về chủ đề này, vui lòng theo dõi Làm thế nào để @synchronized khóa / mở khóa trong Objective-C?
Câu trả lời tuyệt vời ở đây:
Giúp hiểu phương thức lớp trả về singleton
với lời giải thích sâu hơn về quá trình tạo ra một singleton.
@synchronized
là thread safe
cơ chế. Đoạn mã được viết bên trong hàm này trở thành một phần của critical section
nó mà chỉ một luồng có thể thực thi tại một thời điểm.
@synchronize
áp dụng khóa một cách ngầm trong khi NSLock
áp dụng nó một cách rõ ràng.
Nó chỉ đảm bảo an toàn cho chủ đề, không đảm bảo điều đó. Ý tôi là bạn thuê một tài xế chuyên nghiệp cho chiếc xe của bạn, điều đó vẫn không đảm bảo rằng chiếc xe sẽ không gặp tai nạn. Tuy nhiên xác suất vẫn là nhỏ nhất.
@synchronized
nó thì không có gì - bạn không được bảo vệ. 2)@synchronized
là chậm .