java并发---原子性对比(syncronized,Lock,Atomic),可见性,有序性

本文探讨了原子性操作的特点及应用,如synchronized、Lock和Atomic的不同之处,并详细解释了可见性的概念及其在并发编程中的重要性。此外,还介绍了happens-before原则的八大规则,帮助读者理解如何确保程序的正确执行顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原子性对比

synchronized:不可中断锁,适合竞争不激烈,可读性好;

Lock:可中断锁,多样化同步,竞争激烈时能维持常态;

Atomic:竞争激烈时能维持常态,比Lock性能好;只能同步一个值。

可见性

Synchronized,volatile

有序性

happens-before原则

    1.程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作;

    2.锁定规则:一个unlock操作先行发生于后面对同一个锁的lock操作;

    3.volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作;

    4.传递规则:如果操作A先行发生于操作B,而操作B又先行发生与操作C,则可以得出操作A先行发生于操作C;

    5.线程启动规则:Thread对象的start()方法先行发生于此线程的每一个动作;

    6.线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生;

    7.线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回手段检测到线程已经终止执行;

    8.对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始。


### 原子性在编程数据库事务中的意义 #### 数据库事务中的原子性 在数据库事务中,原子性表示一个事务内的所有操作要么全部成功提交,要么完全回滚,不会停留在中间状态。这种特性确保了即使遇到错误或者异常情况,数据的一致性完整性也不会被破坏[^1]。 例如,在银行转账过程中,如果从账户A向账户B转款涉及到两个更新操作——减少A的余额以及增加B的余额,则这两个动作必须作为一个整体来对待;只有当两者都能顺利完成时才真正执行这笔交易,否则就应当撤销所有的更改以保持原有状态不变。 #### 编程环境下的原子性实现 为了保证程序运行过程中的某些关键部分具有类似的不可分割性质,开发者可以采用多种方式来达成这一目标: - **锁机制**:通过加锁的方式防止其他线程或进程干扰当前正在执行的操作序列直到其结束为止。 - **乐观并发控制 (Optimistic Concurrency Control)** :假设冲突很少发生,并允许多版本共存直至最后验证阶段再决定是否接受变更。 - **硬件指令支持**:利用现代CPU提供的特殊机器码如Compare-and-Swap(CAS),Test-and-Set(TS)等来进行细粒度同步而无需阻塞整个资源访问路径。 ```java // 使用Java中的synchronized关键字保证方法调用期间只有一个线程能够进入临界区 public synchronized void transferMoney(Account fromAccount, Account toAccount, double amount){ if(fromAccount.getBalance() >= amount){ fromAccount.setBalance(fromAccount.getBalance()-amount); toAccount.setBalance(toAccount.getBalance()+amount); }else{ throw new InsufficientFundsException(); } } ``` 上述代码片段展示了如何在一个简单的资金转移函数里运用`syncronized`关键词确保该段逻辑得以原子化地被执行,即不允许任何外部因素打断此间的连续流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值