大家好
我想问一下,如果有任何类型的实现,可用于在Java
中将方法/部分代码设置为原子操作,因此无法停止/暂停(必须被执行到最后)。我需要这样做以确保当我缓冲MP3
文件到缓冲区时,表示为具有该文件比特率大小的帧的前面,线程将读取整个帧,否则操作将无法完成,但要避免该缓冲区只读取一部分帧,以避免播放中的泪水,以及数据一致性的错误。
我问,因为将有多个线程使用该文件( BufferClass , PlayerClass , FileInfoClass 等等)和文件将作为Critical Part
数据的典型示例实现,因此将通过监视器进行同步。也许有些人可以通过拒绝致电Thread.wait()
/ Thread.notify()
来提供服务,但我在Java
中并不是那么先进。
答案 0 :(得分:4)
您可以使用synchronized语句:
synchronized(anObject){
performSomeOperation();
}
使用相同对象的每个synchronized语句都可以保证等到这样的语句中的另一个线程完成。
Hot Licks评论示例:
synchronized returntype someMethod(parameters ...){
performSomeOperation();
}
在此示例中,锁定的对象是“this”。
答案 1 :(得分:1)
作为对已接受答案的补充,您可能会发现查看已经可用(自Java SE 5起)Java Concurrency Utilities后也很有用。
API规范:
从官方描述(强调我的):
并发实用程序包提供了强大,可扩展的功能 高性能线程实用程序的框架,例如线程池 并阻止队列。这个包使程序员免于需要 手工制作这些实用工具,方式大致相同 集合框架用于数据结构。另外,这些 包为高级并发提供低级原语 编程强>
例如, java.util.concurrent.locks 包为经典的 synchronized 块提供替代:
虽然锁定是通过Java内置到Java语言中的 synchronized 关键字,内置有许多限制 监控锁。 java.util.concurrent.locks 包提供了一个 具有相同内存语义的高性能锁实现 同步,它还支持指定超时时间 试图获得一个锁,每个锁多个条件变量, nonnested(“hand-over-hand”)持有多个锁和支持 用于中断等待获取锁的线程。
有关详情,请参阅Concurrency Utilities Overview。
有用的阅读