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这些包中的类已经用于并发应用程序,即。这已经为你做了。一个简单的经典例题