什么是原子操作,为什么它们是必要的?另外,在Java中如何实现原子操作?
我的理解是,在编程中,原子操作是指有效地一次性发生的操作。原子操作不能在中途停止,它要么完全发生,要么根本不发生。
例如,在网上订购航空机票时,需要执行两个操作:付款和座位预订。潜在的乘客必须:
- 同时付款和预订座位,或者
- 既不付款也不预订座位
原子操作的实现可以使用Java提供的synchronized关键字或者java.util.concurrent.atomic包中提供的原子类。
什么是原子操作,为什么它们是必要的?另外,在Java中如何实现原子操作?
我的理解是,在编程中,原子操作是指有效地一次性发生的操作。原子操作不能在中途停止,它要么完全发生,要么根本不发生。
例如,在网上订购航空机票时,需要执行两个操作:付款和座位预订。潜在的乘客必须:
原子操作的实现可以使用Java提供的synchronized关键字或者java.util.concurrent.atomic包中提供的原子类。
在我看来,您的解释更多地解释了数据库事务中原子性的含义:ACID中的A。
关于并发性,原子性意味着当一个线程修改某个对象(或一组对象)的状态时,另一个线程无法看到任何中间状态。它要么看到操作之前的状态,要么看到操作之后的状态。
例如,改变长整型变量的值不是一个原子操作。它涉及设置前32位的值,然后设置后32位的状态。如果对长整型变量的访问没有得到适当的同步,那么一个线程可能会看到中间状态:前32位已经被改变,但后32位还没有被改变。
实现原子操作的方法是使用同步。同步涉及使用
事实上,原子操作并不是不能在中途停止。更确切地说,所有的影响都会在操作完成(提交)时变得可见,或者根本不可见(中止/回滚),因此它可以被停止,但系统状态不会更新。
原子性 - 意味着在一个事务中,要么所有语句都被执行,要么没有一条语句被执行。
如果一个事务有5个语句。如果在所有语句运行之前发生故障,则原子性意味着要么执行5个语句,要么不执行任何语句。