`
zwt2001267
  • 浏览: 444800 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java中关键字volatile的作用

    博客分类:
  • Java
 
阅读更多

 

什么是原子操作? 

所谓原子操作,就是"不可中断的一个或一系列操作" , 在确认一个操作是原子的情况下,多线程环境里面,我们可以避免仅仅为保护这个操作在外围加上性能昂贵的锁,甚至借助于原子操作,我们可以实现互斥锁。 很多操作系统都为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 volatile 关键字实战java ...

    Java关键字volatile和synchronized作用和区别

    Java关键字volatile和synchronized是Java语言中两个常用的关键字,它们都是用来解决多线程编程中的同步问题的,但它们的作用和用法却有所不同。 volatile关键字是变量修饰符,它的作用是确保变量在多个线程之间的...

    java volatile 关键字 学习

    java volatile 关键字 学习

    Java 关键字 volatile 的理解与正确使用

    Java 语言中关键字 volatile 被称作轻量级的 synchronized,与 synchronized 相比,volatile 编码相对简单且运行时的开销较少,但能够正确合理地应用好 volatile 并不是那么的容易,因为它比使用锁更容易出错。...

    Java中的关键字volatile详解

    Java中的关键字volatile详解 一、volatile关键字原理 在Java中,volatile关键字经常用来修饰变量。volatile关键字的作用是使变量在多个线程之间可见。volatile关键字可以保证变量的可见性,但不能保证变量的原子性...

    一文精通Java中的volatile关键字

    Java中的`volatile`关键字是多线程编程中的一个重要概念,它的主要作用是确保共享变量的可见性和禁止指令重排序。本文将深入探讨`volatile`的关键特性、工作原理以及使用注意事项。 1. 可见性: `volatile`关键字...

    java里的volatile关键字详解

    "Java中的Volatile关键字详解" Java中的Volatile关键字详解是Java中的一种关键字,用于保证线程之间的可见性、原子性和有序性。下面是对Java中的Volatile关键字详解的知识点总结: 一、基本概念 1. 可见性:可见...

    Java线程:volatile关键字

    Java 线程 volatile 关键字详解 Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。volatile 变量的同步性较差,但它有时更简单并且开销更低。volatile 变量可以被看作是一种 “程度较轻的 ...

    深入解析Java中的volatile关键字:原理、应用与实践

    在Java并发编程中,volatile关键字是一种轻量级的同步机制,它用于确保变量的可见性和有序性。本文将详细探讨volatile关键字的工作原理、使用场景以及如何在实际开发中正确使用volatile。 volatile关键字是Java并发...

    解析java中volatile关键字

    Java中的`volatile`关键字是多线程编程中的一个重要概念,它的主要作用是解决并发环境下的可见性和有序性问题。在Java内存模型(JMM)中,每个线程都有自己的工作内存,其中包含了线程对共享变量的副本。线程间的...

    Java中volatile关键字的作用与用法详解

    Java中的`volatile`关键字是一个非常重要的并发编程工具,它的作用主要体现在两个方面:**可见性**和**有序性**。本文将深入解析`volatile`的关键字特性及其在实际编程中的应用。 1. 可见性: 当一个共享变量被`...

    Java并发编程:volatile关键字解析

    总结来说,`volatile`关键字是Java并发编程中一个非常重要的概念。它不仅解决了多线程环境下的可见性问题,还能够在一定程度上保证有序性。然而,它并不保证复合操作的原子性,因此在设计并发程序时,还需要根据具体...

    Java的关键字与保留字

    Java拥有51个关键字,这些关键字在编程中扮演着核心角色,用于声明类型、控制流程、异常处理等。下面我们将逐一介绍这些关键字: 1. **abstract**:用于定义抽象类和抽象方法,表示该类不能被实例化,或方法没有...

    Java中volatile关键字的含义

    在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候可以万事大吉。  Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 ...

    java语言的volatile教程,java语言的volatile关键字是干什么用的

    java语言的volatile教程,java语言的volatile关键字到底怎么用

    Java基础之关键字_Java基础之关键字_源码

    在编程语言的学习中,了解和掌握关键字是至关重要的一步,特别是在Java这种强类型的语言中。本文将深入探讨Java中的关键字,这些关键字是Java语法结构的基础,它们被Java编译器特殊处理,有着特定的含义和功能。 ...

    多方面解读Java中的volatile关键字.rar

    在Java编程语言中,`volatile`关键字是一个非常关键的同步原语,用于处理并发编程中的可见性和有序性问题。这个关键字对于理解Java内存模型(JMM)以及如何编写线程安全的代码至关重要。下面我们将从多个角度深入...

    java中的关键字大全

    根据给定的部分内容,我们可以列出以下Java关键字: 1. **abstract** 2. **continue** 3. **for** 4. **new** 5. **switch** 6. **assert** 7. **default** 8. **if** 9. **package** 10. **synchronized** 11. **...

    Java中volatile关键字的总结.docx

    `volatile`关键字的作用在于强制线程每次使用变量时都从主内存中读取最新的值,而不是依赖于本地内存的副本,这样确保了不同线程间的共享变量可见性。 ### 四、`volatile`关键字的限制与使用场景 虽然`volatile`...

    java关键字总结文档

    以下是对给定文件中提到的Java关键字进行的详细解释与总结: #### 1. `abstract` - **用途**:`abstract`关键字用于声明抽象类或抽象方法。抽象类不能被实例化,但可以被其他类继承;抽象方法没有具体实现,必须由...

Global site tag (gtag.js) - Google Analytics