有没有办法确保某些语句以原子方式执行

时间:2011-04-13 05:43:56

标签: java

有一些语句,是否有一种简单的方法可以确保它以原子方式执行?

5 个答案:

答案 0 :(得分:13)

原子?不。尽管人们在这里说的是,线程安全并不意味着原子:

// this is NOT atomic!
synchronized(this) {
    makeChangeA();
    makeChangeB();
}

如果makeChangeB()抛出异常,makeChangeA()将回滚它的更改。

atomic的定义“完全执行,或根本不执行”。同步块不是原子的。

答案 1 :(得分:2)

如果您的重点是“简单方法”,则可以试用@SynchronizedProject Lombok注释。

答案 2 :(得分:0)

<击>

<击>
synchronized (obj)
{
    //any other thread synchronizing against obj waits until this block is done
}

<击>

修改

正如提到yamburg的道路所提到的,这不是原子性的;我原以为你只是想确保两个块在执行时不重叠。如果实际上您正在寻找原子操作,那么您需要使用事务的用户,这绝非易事。有关详细信息,请参阅AtomicityTransaction 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不仅是同步,而且也意味着一切或没有。