什么是原子操作?
所谓原子操作,就是"不可中断的一个或一系列操作" , 在确认一个操作是原子的情况下,多线程环境里面,我们可以避免仅仅为保护这个操作在外围加上性能昂贵的锁,甚至借助于原子操作,我们可以实现互斥锁。 很多操作系统都为int类型提供了+-赋值的原子操作版本,比如 NT 提供了 InterlockedExchange 等API, Linux/UNIX也提供了atomic_set 等函数。
关于java中的原子性?
原子性可以应用于除long和double之外的所有基本类型之上的“简单操作”。对于读取和写入出long double之外的基本类型变量这样的操作,可以保证它们会被当作不可分(原子)的操作来操作。 因为JVM的版本和其它的问题,其它的很多操作就不好说了,比如说++操作在C++中是原子操作,但在Java中就不好说了。 另外,Java提供了AtomicInteger等原子类。再就是用原子性来控制并发比较麻烦,也容易出问题。
volatile原理是什么?
Java中volatile关键字原义是“不稳定、变化”的意思
使用volatile和不使用volatile的区别在于JVM内存主存和线程工作内存的同步之上。volatile保证变量在线程工作内存和主存之间一致。
其实是告诉处理器, 不要将我放入工作内存, 请直接在主存操作我.
以下一段有意思的代码:
package jdk.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class TestMultiThread implements Runnable { private static int i; private static volatile Integer vi = 0; private static AtomicInteger ai = new AtomicInteger(); private static Integer si = 0; private static int ri; private static AtomicInteger flag = new AtomicInteger(); private Lock lock = new ReentrantLock(); @Override public void run() { for (int k = 0; k < 200000; k++) { i++; vi++; ai.incrementAndGet(); synchronized (si) { si++; } lock.lock(); try { ri++; } finally { lock.unlock(); } } flag.incrementAndGet(); } public static void main(String[] args) throws InterruptedException { TestMultiThread t1 = new TestMultiThread(); TestMultiThread t2 = new TestMultiThread(); ExecutorService exec1 = Executors.newCachedThreadPool(); ExecutorService exec2 = Executors.newCachedThreadPool(); exec1.execute(t1); exec2.execute(t2); while (true) { if (flag.intValue() == 2) { System.out.println("i >>>>>" + i); System.out.println("volatile vi >>>>>" + vi); System.out.println("AtomicInteger ai >>>>>" + ai); System.out.println("synchronized si >>>>>" + si); System.out.println("lock ri >>>>>" + ri); exec1.shutdown(); exec2.shutdown(); break; } Thread.sleep(50); } } }
运行结果如下:
i >>>>>395805
volatile vi >>>>>369741
AtomicInteger ai>>>>>400000
synchronized si>>>>>379400
lock ri>>>>>392087
volatile,因为java中++不是原子操作,所以值不正确。
synchronized 锁定的不是同一个对象,因为si对象一直在变,改成如下代码则正确:
synchronized (Integer.class) { si++; }
lock 锁定的不是同一个对象,加static关键字修饰,改成类变量则正确。
private static Lock lock = new ReentrantLock();
参考:http://blog.csdn.net/luohuacanyue/article/details/7796352
相关推荐
java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java ...
java volatile 关键字 学习
主要讲述java线程volatile关键字
volatile是java中的关键词之一,这篇文章主要给大家介绍了关于Java中volatile关键字的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。这篇文章主要介绍了Java中volatile关键字的作用与用法详解的相关资料,需要的朋友可以参考下
主要为大家详细介绍了Java关键字volatile和synchronized的作用和区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Java并发编程:volatile关键字解析
主要介绍了Java中的关键字volatile,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
主要为大家解析了java中volatile关键字,经常有人把volatile关键字和synchronized或者lock混淆,本文就为大家好好区分,感兴趣的小伙伴们可以参考一下
volatile这个关键字,不仅仅在Java语言中有,在很多语言中都有的,而且其用法和语义也都是不尽相同的。这篇文章主要介绍了Java中的volatile关键字,需要的朋友可以参考下
多方面解读Java中的volatile关键字.rar
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 ...
java语言的volatile教程,java语言的volatile关键字到底怎么用
本文主要介绍 volatile 的使用准则,以及使用过程中需注意的地方,感兴趣的朋友一起看看吧
java里的volatile关键字详解
主要介绍了java volatile关键字使用方法及注意事项的相关资料,当一个变量被声明为 volatile 后,java 内存模型确保所有使用该变量的线程能看到相同的、一致的值。,需要的朋友可以参考下
java里的volatile关键字详解.pdf
主要介绍了Java线程编程中的volatile关键字的作用,针对其禁止进行指令重排序和读写内存方面着重讲解,需要的朋友可以参考下
在本文里我们给大家分享的是关于java volatile关键字作用及使用场景的相关知识点内容,需要的朋友们学习下。
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果,本文给大家介绍java中volatile关键字,需要的朋友参考下