Java中是否有任何原子方法的实现?

时间:2014-01-27 19:53:23

标签: java multithreading atomic critical-section

大家好

我想问一下,如果有任何类型的实现,可用于在Java中将方法/部分代码设置为原子操作,因此无法停止/暂停(必须被执行到最后)。我需要这样做以确保当我缓冲MP3文件到缓冲区时,表示为具有该文件比特率大小的帧的前面,线程将读取整个帧,否则操作将无法完成,但要避免该缓冲区只读取一部分帧,以避免播放中的泪水,以及数据一致性的错误。

我问,因为将有多个线程使用该文件( BufferClass PlayerClass FileInfoClass 等等)和文件将作为Critical Part数据的典型示例实现,因此将通过监视器进行同步。也许有些人可以通过拒绝致电Thread.wait() / Thread.notify()来提供服务,但我在Java中并不是那么先进。

2 个答案:

答案 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


有用的阅读