java用volatile或AtomicBoolean实现高效并发处理 (只初始化一次的功能要求)

最近碰到一个这样的功能要求:怎么在一个类里面,实现高效并发处理下只可以初始化一次的方法?

实现方式:

1)volatile方式:

[java] view plain copy

  1. /**
  2. * Created by Chengrui on 2015/7/28.
  3. */
  4. public class MyThread {
  5. private static volatile boolean initialized = false;
  6. public void init(){
  7. if(initialized == false){
  8. initialized = true;
  9. //here is the initialization code
  10. }
  11. }
  12. }

2)AtomicBoolean方式:

[java] view plain copy

  1. /**
  2. * Created by Chengrui on 2015/7/28.
  3. */
  4. public class MyThread {
  5. private static AtomicBoolean initialized = new AtomicBoolean(false);
  6. public void init(){
  7. if(initialized.compareAndSet(false, true)){
  8. //here is the initialization code
  9. }
  10. }
  11. }

附:AtomicBoolean帮助文档:

时间: 2024-10-25 04:11:17

java用volatile或AtomicBoolean实现高效并发处理 (只初始化一次的功能要求)的相关文章

转:java中volatile关键字的含义

转:java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制. synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 sync

使用CAS实现高效并发处理

在并发处理应用中,一般使用锁的方式来解决竞争问题,但锁的效率比较低,因此,在高并发处理中,无锁队列成为应用的需要.CAS无锁算法主要依赖于处理器的支持,绝大多数处理器都支持: X86平台:CMPXCHG 汇编指令. 在一个指令周期内执行完成,因此是原子性的. 这一原理性操作过程如果采用C描述如下: intcompare_and_swap (int* reg, int oldval, int newval) { int old_reg_val = *reg; if (old_reg_val ==

【转】java中volatile关键字的含义

java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制. synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 synchr

java中volatile关键字

java中volatile关键字 学习ImageLoader源码时遇到遇到这么一个关键字,以前没遇到过,也不明白是何含义,网上找了部分资料,总结记录一下. 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉.Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制. synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来

Java中Volatile表示什么

Java中volatile修饰符是一种用来保证不同线程之间交互的特殊机制.当一个线程修改volatile变量,另一个线程能够看到这个修改.第一个线程通知第二个线程变量已经被修改. 下面用图来解释: ready是一个volatile boolean变量, 初值设为false. answer是一个非volatile int变量,初值是0. 第一个线程准备好修改ready变量,它是两个线程交流的发送方.第二个线程读取ready变量,获取第一个线程修改的值,因此它是接收方.在两个线程交流时,在线程1修改

java中Volatile修饰符的含义

在java语言中:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值进行对比. volatile关键字的作用就是提示vm:对于这个成员变量不能保存它的私有拷贝,而应直接与共享变量进行交互. 被volatile修饰符修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值.而且,当成员变量发生变化时,又强迫线程将变化了的值写回共享内存,这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值.这样当多个线程同时与某个

JAVA并发--volatile

学过计算机组成原理的一定知道,为了解决内存速度跟不上CPU速度这个问题,在CPU的设计中加入了缓存机制,缓存的速度介于CPU和主存之间.在进行运算的时候,CPU将需要的数据映射一份在缓存中,然后直接操作位于缓存中的数据,操作完毕后再将缓存中的数据写回到主存.这在单线程环境中是没有任何问题的.但是在多线程环境中就大不同了. 假设现在有这样的一个场景:有两个线程thread1和thread2,他们都在操作位于主存上的一个数据int a=2(具体操作为读取a的值并执行一个自增操作).逻辑上正确的结果:

Java's Volatile Keyword

转自 http://tutorials.jenkov.com/java-concurrency/volatile.html The Java volatile keyword is used to mark a Java variable as "being stored in main memory". More precisely that means, that every read of a volatile variable will be read from the com

不惑JAVA之JAVA基础 - volatile

volatile在多线程并发中用途非常广,原因是它有两个特性: 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的. 禁止进行指令重排序. 内存模型的相关概念 要想弄明白volatile的原理,先需要知道内存模型的一些概念. 计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和