`
darrenzhu
  • 浏览: 804493 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java中的Volatile关键字使用要点

    博客分类:
  • Java
阅读更多
Volatile变量只能保证可见性,在不符合以下两条规则的运算场景中,仍然需要通过加锁(使用synchronized或java.util.concurrent中的原子类)来保证原子性。
1)运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。
2)变量不需要与其他的状态变量共同参与不变约束。

Java内存模型中关于主内存与工作内存之间的交互协议可以从下图中窥探一二


下面的例子说明了volatile并不能保证变量在多线程中是一致的。


package com.practise.concurrency.volatilevar;

/**
 * This is a case to indicate that volatile decoration doesn't help solve the concurrent writing issue.
 * @author DarrenZhu
 *
 */
public class VolatileTest {
	private static volatile int value;
	
	public static int increase() {
		return value++;
	}
	
	private static int Thread_Number = 10000;
	
	public static void main(String[] args) {
		for (int i = 0; i < Thread_Number; i++) {
			new Thread(new Runnable() {
				public void run() {
					try {
						Thread.sleep(5);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					increase();
				}
			}).start();
		}
		
		while (Thread.activeCount() > 1) {
			Thread.yield();
		}
		
		System.out.println("value is " + value);//value <= Thread_Number
	}
}



多次运行程序,发现value的值总是小于或等于Thread_Number的,不会像我们期望的那样,总是等于Thread_Number.
  • 大小: 57.8 KB
分享到:
评论

相关推荐

    多线程系列相关的技术要点

    4. Java多线程学习(三)volatile关键字 5. Java多线程学习(四)等待/通知(wait/notify)机制 6. Java多线程学习(五)线程间通信知识点补充 7. Java多线程学习(六)Lock锁的使用 8. Java多线程学习(七)...

    Java面试要点(适用于2年以上经验,1年亦可)

    9. 熟悉 Java 中各种关键字:transient、instanceof、volatile、synchronized、final、static、const 集合类 1. ArrayList 和 LinkedList 和 Vector 的区别 2. SynchronizedList 和 Vector 的区别 3. HashMap、...

    java面试题

    - 面试官可能会询问面试者在实际工作中如何利用`volatile`关键字来解决多线程下的线程安全问题,或者如何在分布式环境中使用`volatile`来确保数据一致性。 综上所述,Java面试不仅关注面试者的基础知识和编码能力...

    Java开发经常遇到的经典265道题.docx

    - volatile关键字的作用。 5. **反射**: - Class对象的获取方法。 - 使用反射动态创建对象。 - 方法调用与字段修改。 ### Spring框架 1. **依赖注入(DI)**: - 构造器注入与setter注入的区别。 - 注解@...

    Java面试题要点总结

    - `volatile`关键字确保共享变量在多线程环境中的可见性,并禁止指令重排序。 - `CAS`是一种乐观锁,通过比较并交换值来实现无锁编程,不会导致线程阻塞,但可能会导致自旋等待。 4. **Iterator使用**:Iterator...

    Java 并发核心编程

    - **解决方法**: 使用`volatile`关键字或在`synchronized`代码块内进行操作,以保护共享的`double`和`long`字段。 4. **Race Condition**: - **定义**: 当两个或更多线程以某种不确定的顺序执行时,可能会导致...

    举例解析Java多线程编程中需要注意的一些关键点

    本文将重点讨论Java多线程编程中需要注意的三个关键点:同步方法与同步代码块的选择、ThreadLocal变量的使用以及volatile关键字的作用。 1. 同步方法与同步代码块 在Java中,同步机制是通过`synchronized`关键字...

    最新java基础教程

    - 线程间的通信:同步锁、volatile关键字、等待/通知机制 - 并发工具类:CountDownLatch、CyclicBarrier、Semaphore等 4. **输入/输出流** - 文件I/O流的操作:FileInputStream、FileOutputStream - 字符流与...

    Java语言编程规范--华为技术有限公司

    - 使用volatile关键字保证可见性,使用synchronized保证线程安全。 - 避免过度使用锁,考虑使用并发容器,如`ConcurrentHashMap`。 8. **集合操作** - 使用泛型来指定集合元素类型,避免类型转换错误。 - 避免...

    Java线程学习好资料

    - wait()、notify()和notifyAll()方法:在线程间进行通信,但必须在synchronized块中使用,否则会抛出异常。 - Phaser、CyclicBarrier和CountDownLatch等同步工具类:适用于复杂的多线程协作场景。 此外,Java还...

    2019面试必问Android知识点(实战北京各大互联网公司面试汇总).pdf

    例如,在解释Java多线程时,需要能够说明synchronized和volatile关键字的区别与使用场景,以及在什么情况下应该使用锁机制来保证线程安全。此外,了解JVM的内存模型和垃圾回收机制对于编写高效的代码是十分必要的。 ...

    如何迅速成为Java高手[原创] -Java_com_cn.htm

    理解线程的基本概念,会使用synchronized、volatile、ThreadLocal等关键字,以及并发工具类如Semaphore、CountDownLatch、CyclicBarrier,能够让你写出高效的多线程程序。 然后,深入学习Java IO/NIO/BIO,理解其...

    [ppt]Java编程风格及基础类库使用(free)

    - volatile关键字:保证多线程环境下的可见性和有序性。 - Lock接口和ReentrantLock类:更灵活的锁机制。 8. **IO流** - 文件操作:File类用于文件和目录的创建、删除等操作。 - 字节流:InputStream和...

    2018年java面试题&amp;答案大全(整理全面版)

    3. volatile关键字:确保多线程环境下变量的可见性,但不保证原子性。 4. wait()、notify()、notifyAll()方法:用于线程间的通信。 六、IO流 1. 流的分类:按照流向分为输入流和输出流,按照数据类型分为字节流和...

    Java开发全面通(教程,实例,资源)

    - **const**:保留关键字,但目前并未在Java中使用。 - **goto**:同样作为保留关键字,未在Java中使用。 - **delegatemulticast**:这两个词似乎是指特定于某个库的功能,而非Java标准库的一部分。 3. **数据...

    Alibaba Java Coding Guidelines 2.1.1

    - 避免在循环中使用`remove()`、`add()`等修改集合的方法,可能导致并发修改异常。 7. **并发编程**: - 使用`volatile`关键字保证线程间的可见性,但不保证原子性。 - 使用`synchronized`关键字控制多线程访问...

    java面试100题以及答案地址

    - **volatile关键字**: 保证变量的可见性和禁止指令重排。 以上仅为Java面试题中的一部分内容,每一道题目都包含了丰富的技术点和深入的理解。对于求职者来说,熟练掌握这些知识点不仅能够帮助应对面试挑战,还能在...

    java并发编程实践

    ### Java并发编程实践知识点详解 #### 一、Java并发编程基础 ##### 1.1 并发与并行概念区分 在Java并发编程实践中,首先需要理解...希望这些知识点能够帮助大家更好地理解和掌握Java并发编程的核心概念和技术要点。

Global site tag (gtag.js) - Google Analytics