JAVA多线程同步:volatile,synchronized,Atomic... 比较

来源:互联网 发布:澳门网络博客公司顶级 编辑:程序博客网 时间:2024/05/18 20:32

1.

Atomic..系列的对象属于

java.util.concurrent.atomic包

在多线程程序中,能保证对该对象的操作的原子性,常用在需要做递增、递减操作的变量,如计数器。


2.

volatile

能保证所修饰的变量的在并发状态下的可见性,但无法保证原子性。

ps:

可见性是指,多个线程之间,总能看到变量的最新值。

原子性是,针对变量的读--改--写操作


只有当所修饰的变量满足如下条件时,才能用volatile做线程同步:

1. 对变量的写入操作不依赖于当前值。

2. 变量不会跟其他状态变量一起纳入不变性条件中。

即: —— 变量真正独立于其他变量和自己以前的值 —— 


3.
synchronized

既能保证可见性,又能保证原子性。

不过程序性能开销较大,另外,synchronized修饰方法,或者程序块。

修饰方法时,被修饰的对象为(this),整个方法体都在同步范围内。

修饰代码块时,必须要提供被同步的对象,并且不能为基本数据类型,但是volatile修饰的可以是基本数据类型。




0 0
原创粉丝点击