2013-05-04 40 views
6

Tôi biết một có thể splice một mục ra khỏi một mảng hoặc xóa nó bằng delete. Cách tiếp cận trước đây có thể gây ra các vấn đề tương tranh, ví dụ: nếu một sợi đang đi qua mảng trong khi một sợi chỉ vừa mới dịch chuyển hoặc ghép. delete không có vấn đề này nếu forEach được sử dụng trên mảng, vì forEach sẽ đi qua các lỗ trong mảng.Xóa mảng an toàn chủ đề

Tuy nhiên, mảng không thể tiếp tục phát triển mãi mãi và sẽ cần quét, có khả năng gây ra cùng một vấn đề như trong trường hợp ghép nối. Âm thanh như tôi cần khóa, nhưng tôi sẽ thích thú nếu Javascript có bất kỳ cơ sở nào cho nó. Có suy nghĩ gì không?

+2

JavaScript không hỗ trợ chủ đề, ngoại trừ một tính năng HTML5 gần đây (và điều đó không cho phép chia sẻ mảng) – Dave

+1

Bạn có thể hiển thị cho chúng tôi ví dụ về hai "chuỗi" đang cố gắng truy cập một mảng cùng một lúc không? Không nên với JavaScript – Bergi

+0

@Bergi "nên"? –

Trả lời

5

Không, bạn không thể có vấn đề tương tranh vì JavaScript không đa luồng. Ngay cả khi bạn sử dụng webworkers bạn sẽ không gặp vấn đề gì vì không có dữ liệu được chia sẻ (công nhân giao tiếp bằng cách truyền tải thông điệp). Ngay cả trong node.js, tập lệnh của bạn không phải là đa luồng.

Vì vậy, chỉ cần sử dụng splice, không cần khóa mảng.

+0

Điều đó có ý nghĩa trong ánh sáng của 'libev' mà node.js sử dụng. Tôi nên nghiên cứu thêm một chút trước khi hỏi điều này! Cảm ơn. – dmkc

+0

Với ECMA6, JavaScript không đồng bộ với trợ giúp của Lời hứa. Bây giờ chúng ta có thể tạo các hàm async. Vì vậy, bạn không nghĩ rằng chúng tôi có thể cần một khóa? –

+0

@JayShah có một số trường hợp bạn có thể thực thi xen kẽ do không đồng bộ/chờ đợi nhưng không phải trong quá trình thực thi câu lệnh tách. Nếu một số khối mã không thực hiện các cuộc gọi không đồng bộ, nó sẽ không bị hỏng và không có mã người dùng nào khác được thực hiện cùng một lúc. –

1

Javascript đã được đơn giản hóa nên không có vấn đề gì.