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 @synchronizedchỉ 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 @synchronizedchỉ thị đề cập đến cùng một đối tượng . Đối tượng được truyền cho @synchronizedchỉ 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 nilvớ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 @synchronizedlà 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 @synchronizednà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.
@synchronizedlà thread safecơ chế. Đoạn mã được viết bên trong hàm này trở thành một phần của critical sectionnó 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.
@synchronizednó thì không có gì - bạn không được bảo vệ. 2)@synchronizedlà chậm .