Java中有原子方法的实现吗?

Java中有原子方法的实现吗?,java,multithreading,atomic,critical-section,Java,Multithreading,Atomic,Critical Section,大家好 我想问一下,是否有任何类型的实现可以用来在Java中将方法/部分代码设置为原子操作,这样就不能停止/暂停(必须执行到底)。我需要这样做,以确保当我将MP3文件缓冲到缓冲区时,线程将读取整个帧,否则操作将失败,但为了避免缓冲区将只读取部分帧,以避免播放时出现撕裂和数据一致性错误 我这样问是因为将有多个线程处理该文件(BufferClass、PlayerClass、FileInfoClass等),并且该文件将作为数据的关键部分的典型示例实现,因此将通过监视器进行同步。也许这可以通过调用Thr

大家好

我想问一下,是否有任何类型的实现可以用来在
Java
中将方法/部分代码设置为原子操作,这样就不能停止/暂停(必须执行到底)。我需要这样做,以确保当我将
MP3
文件缓冲到缓冲区时,线程将读取整个帧,否则操作将失败,但为了避免缓冲区将只读取部分帧,以避免播放时出现撕裂和数据一致性错误


我这样问是因为将有多个线程处理该文件(BufferClass、PlayerClass、FileInfoClass等),并且该文件将作为数据的
关键部分的典型示例实现,因此将通过监视器进行同步。也许这可以通过调用
Thread.wait()
/
Thread.notify()
来实现,但我在
Java
方面没有那么先进,您可以使用synchronized语句:

synchronized(anObject){
    performSomeOperation();
}
使用同一对象的每个同步语句都保证等待,直到该语句中的另一个线程完成

热舔注释示例:

synchronized returntype someMethod(parameters ...){
    performSomeOperation();
}

在本例中,锁定的对象是“this”。

您可以使用synchronized语句:

synchronized(anObject){
    performSomeOperation();
}
使用同一对象的每个同步语句都保证等待,直到该语句中的另一个线程完成

热舔注释示例:

synchronized returntype someMethod(parameters ...){
    performSomeOperation();
}

在本例中,被锁定的对象是“this”。

作为已接受答案的补充,您可能会发现查看已可用的(自Java SE 5以来)也很有用

API规范:

  • 包装
  • 包装
  • 包装
根据官方描述(我的重点):

并发实用程序包提供了一个功能强大、可扩展的 高性能线程实用程序的框架,如线程池 阻塞队列。这个软件包使程序员不再需要软件 要手工制作这些实用程序,方法与 集合框架不支持数据结构。此外,这些 包为高级并发应用程序提供低级原语 编程


例如,java.util.concurrent.locks包为经典的同步块提供了一个替代方案:

而锁定是通过 synchronized关键字,内置 监视器锁定。java.util.concurrent.locks包提供了 具有与相同内存语义的高性能锁实现 同步,并且它还支持在 试图获取一个锁,每个锁有多个条件变量, 非嵌套(“交锁”)多锁固定和支撑 用于中断等待获取锁的线程

有关更多信息,请参阅


有用的阅读


作为对公认答案的补充,您可能会发现还可以查看已有的答案(自JavaSE5以来)

API规范:

  • 包装
  • 包装
  • 包装
根据官方描述(我的重点):

并发实用程序包提供了一个功能强大、可扩展的 高性能线程实用程序的框架,如线程池 阻塞队列。这个软件包使程序员不再需要软件 要手工制作这些实用程序,方法与 集合框架不支持数据结构。此外,这些 包为高级并发应用程序提供低级原语 编程


例如,java.util.concurrent.locks包为经典的同步块提供了一个替代方案:

而锁定是通过 synchronized关键字,内置 监视器锁定。java.util.concurrent.locks包提供了 具有与相同内存语义的高性能锁实现 同步,并且它还支持在 试图获取一个锁,每个锁有多个条件变量, 非嵌套(“交锁”)多锁固定和支撑 用于中断等待获取锁的线程

有关更多信息,请参阅


有用的阅读


原子性是相对的。您可以通过使用同步块的监视器锁定来实现这一点。我无法从您的问题中判断您是在询问如何创建互斥锁(即,防止多个线程同时修改相同的数据),还是在询问某种性能保证(即,确保此线程在完成任务之前不会被抢占。)下面的前两个答案告诉您如何进行互斥。原子性是相对的。您可以通过使用同步块的监视器锁定来实现。我无法从您的问题中判断您是否询问如何创建互斥(即,防止多个线程同时修改相同的数据),或者您是否要求某种性能保证(即,确保此线程在完成作业之前不会被抢占)下面的前两个答案告诉您如何进行互斥。如果您愿意,您可以使整个方法同步。如果您愿意,您可以使整个方法同步。它可以用于对象,还是仅用于基本类型?@JánSrniček这些包中的类已经用于并发应用程序,即。这已经为你做了。一个简单的经典例题