Đồng thời là một miền rộng lớn với nhiều vấn đề và cạm bẫy. Không có một cách tiếp cận duy nhất có thể giải quyết tất cả các vấn đề và một chuyên gia đồng thời thực sự có thể kết hợp một số phương pháp để có được kết quả tốt nhất.
Hiện tại trên thế giới JVM, tôi không nghĩ có các lựa chọn thay thế tốt hơn các số nguyên nguyên tử để tăng bộ đếm, đặc biệt nếu tranh chấp rất cao.
Điều đó đang được nói, nếu bạn muốn sử dụng diễn viên, mẹo để có được hiệu suất và khả năng mở rộng là để tránh yêu cầu (?
) hoạt động càng nhiều càng tốt. Sử dụng cho biết thay vào đó (!
) và sau đó sinh lợi. Khi kết quả có sẵn, diễn viên sẽ nhận được nó và tiếp tục kiểm soát. Không có gì khối và hồ bơi thread có thể chăm sóc của các diễn viên khác trong thời gian có nghĩa là. Điều đó chỉ hoạt động nếu hầu hết mã của bạn là bên trong các diễn viên.
Bắt đầu với Thomas giải pháp, bạn có thể viết một cái gì đó như:
case object Inc
case class Count(i)
class IncrementingActor extends Actor {
var i = 0
protected def receive = {
case Inc =>
i += 1
sender ! Count(i)
}
}
class FooActor(counter: ActorRef) extends Actor {
protected def receive = {
case DoSomething() => {
// Perform some work
counter ! Inc
}
case Count(i) => {
// Do something with the counter result
}
}
}
Trường hợp sử dụng hoàn hảo cho đại lý Akka. – elbowich