java AtomicInteger

AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Timer;

import java.util.TimerTask;

import java.util.concurrent.ScheduledThreadPoolExecutor;

import java.util.concurrent.TimeUnit;

import java.util.concurrent.atomic.AtomicInteger;

/**

* @Description

* @Author

* @Date 2015-5-8 上午9:37:45

*/

public class ConcurrentAtomicTest {

private final static AtomicInteger atomicInteger=new AtomicInteger(1);

private static volatile int integer=1;;

/**

* @Description TODO

* @Return void

* @Throws

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

// testAtomicInteger();

testInteger2();

}

public static void testAtomicInteger() {

String time = new SimpleDateFormat("HH:mm:ss").format(new Date());

System.out.println("Start time : " + time);

int temp=atomicInteger.addAndGet(1);//add

atomicInteger.get();//get current

System.out.print(temp+",");

temp=atomicInteger.decrementAndGet();//Atomically decrements by one the current value.

System.out.print(temp+",");

temp=atomicInteger.getAndIncrement();//Atomically decrements by one the current value.

System.out.print(temp+",");

temp=atomicInteger.intValue();//Atomically decrements by one the current value.

System.out.print(temp+",");

atomicInteger.set(0);//Atomically decrements by one the current value.

temp=atomicInteger.get();

System.out.println(temp+",");

//result:2,1,1,2,0,

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(5); // 创建5个执行线程

Runnable runnable = new Runnable() {

@Override

public void run() {

String time = new SimpleDateFormat("HH:mm:ss").format(new Date());

atomicInteger.incrementAndGet();

System.out.println("Now Time : " + time+",integer:"+integer);

}

};

executor.scheduleWithFixedDelay(runnable, 2, 3, TimeUnit.SECONDS);

}

/**

* 测试int加1

* @Description TODO

* @Return void

* @Throws

*/

public static void testInteger2() {

String time = new SimpleDateFormat("HH:mm:ss").format(new Date());

System.out.println("Start time : " + time);

integer++;

System.out.println("integer ++:"+integer);

integer--;

System.out.println("integer --:"+integer);

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(5); // 创建5个执行线程

Runnable runnable = new Runnable() {

@Override

public void run() {

String time = new SimpleDateFormat("HH:mm:ss").format(new Date());

integer=integer+1;

System.out.println("Now Time : " + time+",testInteger2 Integer:"+atomicInteger.get());

}

};

executor.scheduleWithFixedDelay(runnable, 2, 3, TimeUnit.SECONDS);

}

// Start time : 10:27:16

// integer ++:2

// integer --:1

// Now Time : 10:27:18,testInteger2 Integer:1

// Now Time : 10:27:21,testInteger2 Integer:1

// Now Time : 10:27:24,testInteger2 Integer:1

// Now Time : 10:27:27,testInteger2 Integer:1

}

时间: 2024-10-31 09:26:35

java AtomicInteger的相关文章

深入解析Java AtomicInteger 原子类型

深入解析Java AtomicInteger原子类型 在进行并发编程的时候我们需要确保程序在被多个线程并发访问时可以得到正确的结果,也就是实现线程安全.线程安全的定义如下: 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么这个类就是线程安全的. 举个线程不安全的例子.假如我们想实现一个功能来统计网页访问量,你可能想到用count++ 来统计访问量,但是这个自增操作不是线程安全的.coun

Java AtomicInteger类的使用方法详解_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下: public class Sample1 { private static Integer count = 0; synchronized public static void increment() { count++; } } 以下是AtomicInteger的: public class Sample2 { private s

AtomicInteger原理&源码分析

转自https://www.cnblogs.com/rever/p/8215743.html 深入解析Java AtomicInteger原子类型 在进行并发编程的时候我们需要确保程序在被多个线程并发访问时可以得到正确的结果,也就是实现线程安全.线程安全的定义如下: 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么这个类就是线程安全的. 举个线程不安全的例子.假如我们想实现一个功能来统计

【JAVA并发】AtomicInteger源码注释

AtomicInteger源码 在java.util.concurrent.atomic包下提供了大量的原子类,这里以AtomicInteger源码为例,添加了一些注释,个人理解,供参考: 其中比较重要的一个概念是CAS操作,现代CPU已广泛支持,在JDK的AtomicInteger类中是调用了Unsafe类的compareAndSwapInt方法实现的,代码(jdk1.7.0_79)如下: package java.util.concurrent.atomic; import sun.misc

java中AtomicInteger的使用

AtomicInteger,命名带有Atomic,很明显本身是原子性.这个类常是线程安全,多用于高并发对数据的修改.关于多线程原子性,也顺带回顾下可见性原子性原子性具有不可分割的特性.原子操作,具有原子性.比如 i=0属于原子操作,再比如i++,实际是i = i + 1,是可分割的,属于非原子操作.非原子操作不是线程安全,在多线程中经常使用sychronized同步成原子操作.AtomicInteger.AtomicLong等是原子操作,在java.util.concurrent.atomic下

Java并发学习笔记(九)-原子类AtomicInteger

AtomicInteger能够保证对一个整型的操作是原子性.像i++这个操作不是原子操作,存在竞态条件,所以需要加锁,但是加锁的性能不高,如果仅仅为了对一个整数加1.我们来看下他的实现. private volatile int value; AtomicInteger本身持有一个整型变量,所有的操作都是基于这个变量的.变量由violate修饰,这个变量是保证可见性的,具体可见另一篇博客 Java并发学习笔记(六)-互斥性和内存可见性. 来看一下对value加1的操作 public final

【java】线程安全的整型类AtomicInteger

一.遇见AtomicInteger 在看项目代码的时候看到这个类,发现其功能很简单,就是一个整型变量的类型,出于好奇看了其类定义. 该类位于java.util.concurrent.atomic下,在concurrent下可知该类肯定与并发和原子性相关. 二.进一步了解 源码非常简单,结合其他人的博客,基本可以了解到AtomicInteger类是一个提供原子操作的Integer类. 普通的整型类如int和Integer类,在++i/i++等操作并不是线程安全的,在并发环境下容易出现脏数据. At

[Java]初识AtomicInteger

AtomicInteger,这是java提供的一个原子操作Integer的类,这在我眼里还是一个稀客,可能是不怎么感兴趣,以至于一直当作简单的volatile,这也是我的拙见.其实这家伙还是挺好用的,在常见的场景中,如count++或++count,这在java多线程的使用中是不安全的,而AtomicInteger属于原子操作(线程安全),可以在下面的例子中看出来. package org.jan.java.test; import java.util.concurrent.ExecutorSe

Java自增原子性问题(测试Volatile、AtomicInteger)

这是美团一面面试官的一个问题,后来发现这是一道面试常见题,怪自己没有准备充分:i++;在多线程环境下是否存在问题?当时回答存在,接着问,那怎么解决?...好吧,我说加锁或者synchronized同步方法.接着问,那有没有更好的方法? 经过一番百度.谷歌,还可以用AtomicInteger这个类,这个类提供了自增.自减等方法(如i++或++i都可以实现),这些方法都是线程安全的. 一.补充概念 1.什么是线程安全性? <Java Concurrency in Practice>中有提到:当多个