我的理解是,基于队列的并发方法可以在没有锁定的情况下实现。但是我在Actor.scala文件中看到了很多同步关键字(查看2.8.1)。它是同步的,是否有必要,如果有一个未同步的实现,它会有所作为吗?
显然问题不够明确:我的理解是,这可以通过非阻塞队列来实现。为什么不这样做?为什么在这里使用synchronized关键字?可能有一个非常好的理由,或者可能只是因为它是完成它的方式而且没有必要。我只是很好奇。
答案 0 :(得分:3)
关键是你在“行为”方法中写的反应不需要关心同步。此外,假设您没有公开actor的状态,您的程序将完全是线程安全的。
不表示根本没有同步:同步是绝对必要的 [1]来实现对actor的邮箱的读/写访问权限(即发送和接收消息)和也确保演员的私人状态在任何后续反应中保持一致。
这是由图书馆本身实现的,您和用户无需关心它是如何完成的。您的状态是安全的(您甚至不需要使用volatile字段),因为JMM的在保证之前发生。也就是说,如果主存储器写入发生在同步点之前,则在同步之后发生的任何读取都将观察到写入所留下的主存储器状态。
[1] - 通过“同步”,我的意思是一些机制来保证Java内存模型中的先发生关系。其中包括synchronized
关键字,volatile
修饰符和/或java.util.concurrent
锁定原语