有一些语句,是否有一种简单的方法可以确保它以原子方式执行?
答案 0 :(得分:13)
原子?不。尽管人们在这里说的是,线程安全并不意味着原子:
// this is NOT atomic!
synchronized(this) {
makeChangeA();
makeChangeB();
}
如果makeChangeB()抛出异常,makeChangeA()将不回滚它的更改。
atomic的定义“完全执行,或根本不执行”。同步块不是原子的。
答案 1 :(得分:2)
如果您的重点是“简单方法”,则可以试用@Synchronized的Project Lombok注释。
答案 2 :(得分:0)
<击> 撞击>
<击>synchronized (obj)
{
//any other thread synchronizing against obj waits until this block is done
}
击> <击> 撞击>
修改强>
正如提到yamburg的道路所提到的,这不是原子性的;我原以为你只是想确保两个块在执行时不重叠。如果实际上您正在寻找原子操作,那么您需要使用事务的用户,这绝非易事。有关详细信息,请参阅Atomicity和Transaction Processing。
此外,如果您保证原子性,那么您可能也在寻找一致性,隔离和耐久性,这些都是统一的作为ACID属性。这些是also explained on the second page的详细信息。
答案 3 :(得分:0)
正如其他人所说,synchronized不提供真正的原子性。但是,这取决于你想要达到的目标?如果您只对互斥感兴趣,那么同步块可能会对您有所帮助。
然而,一些原子操作是可能的。看看java.util.concurrent.atomic包,例如,提供可以原子递增并在一步中检索的atomicIntegers。否则你需要实现自己的解决方案,比如停止所有其他线程的Semaphors。但请注意,即使你实现了阻止进程的所有其他线程,也可能会阻塞其他干扰你正在做的事情的进程(我说的是其他操作系统进程,而不仅仅是那些在JVM上运行的进程)。 / p>
但是,真的,你想要实现什么?我很确定大多数日常用例都可以通过同步块/方法和/或上面提到的原子级来解决。
答案 4 :(得分:-1)
将它们放在 synchronized
块中,然后它就是JVM的原子。
public class MyClass {
//the English word is synchronizer, not syncronisator
private static final Object syncronisator = new Object();
public void doSomething() {
doSomethingNotSyncronized();
synchronized(syncronisator) {
doItAtomic1():
doItAtomic2():
}
doSomethingNotSyncronized2();
}
}
BTW:如果你想要将完整方法与MyClass实例同步,那么你可以使用:
public class MyClass {
public void synchronized doSomething() {
doItAtomic1():
doItAtomic2():
}
}
编辑: Road to yamburg is right,atomic不仅是同步,而且也意味着一切或没有。