AtomicInteger类的理解及使用

AtomicInteger在多线程并发场景的使用

AtomicInteger提供原子操作来进行Integer的使用,因此十分适合高并发情况下的使用。

AtomicInteger位于包package java.util.concurrent.atomic下,主要源码如下:

首先看到改类里有两个私有的静态变量unsafe和valueOffset,unsafe在jdk源码里通过Unsafe.getUnsafe()得到,但是我们自己是没办法

在代码里直接调用这个静态方法的,因为这个方法在调用时会判断类加载器,我们的代码是没有"受信用"的,而jdk源码没问题.

valueOffset是指类中相应字段在类中的偏移量,具体指value这个字段在AtomicInteger类的内存中相对于该类的首地址的偏移量.

该类里有一个变量value是volatile关键字修饰的,作用是多个线程可以共享该变量,但是此关键字效率比较低,会使虚拟机失去优化作用,

因此,AtomicInteger不要随意使用,要在适用场景下使用.

此类有个比较常用的方法是compareAndSet,当调用该方法时,若value值与expect值相等,则将value值更改为update,返回true,若value值

与expect值不相等,返回false,不做任何操作.

public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

下面代码作用可以阻止其他线程进入方法:

AtomicInteger mutex = new AtomicInteger(0);

if (!mutex.compareAndSet(0, 1)) {
return;
}

原文地址:https://www.cnblogs.com/bingyimeiling/p/8821578.html

时间: 2024-10-28 10:23:16

AtomicInteger类的理解及使用的相关文章

AtomicInteger类的理解与使用

AtomicInteger类的理解与使用 首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下: public class Sample1 { private static Integer count = 0; synchronized public static void increment() { count++; } } 以下是AtomicInteger的: public class Sample2 { private static AtomicInteger

JavaScript es6 class类的理解。

在本篇文章我将会把我对JavaScript  es6新特性class类的理解.本着互联网的分享精神,我就将我自己的理解分享给大家. 使用es写一个类(构造函数) 在es5中大家一般都这么写一个类(构造函数) 另外需要注意,class类不会被提升. // 创建一个User构造函数 function User(name, age) { this.name = name; this.age = age; } // User构造函数的静态方法. User.getClassName = function

伪元素、伪类基础理解

前几天同事问我css中单冒号和双冒号是什么意思,我也模糊得很,只有个笼统的概念就是:伪元素和伪类.一直以为,页面布局中很少使用到伪类,结果细细研究发现我们经常使用的hover就是一个最简单的伪类,顿时觉得自己太OUT了,紧跟着这两天都在看这些东西,其实伪类最简单的理解就是用于向某些选择器添加特殊的效果. 具体伪类.伪元素有哪些我就不一一列举,在w3c中列举的很清楚.我主要写写应用的实例. 1.来个简单的,咱们最常用到的向超链接添加不同的颜色: <html> <head> <m

对于伪类的理解 :first-child

今天看到伪类 :first-child;发现自己对于伪类的理解又有偏差,这里用代码说明一下 代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> span:first-child{ color: red; background-color: re

谈谈Delphi的类和对象:三、类可以理解成一种特殊的数据结构、类型转换

三.类可以理解成一种特殊的数据结构 我们知道数据类型可以进行强制类型转换,类既然可以理解成一种数据类型,那么它也应该可以进行类型转换.比如下面代码为一个按钮(Button1)的单击事件 procedure TForm1.Button1Click(Sender: TObject); var ACaption: String; begin ACaption:= TButton(Sender).Caption; //Sender从TObject转化为TButton ShowMessage(Format

ThreadLocal类深刻理解

synchronized这类线程同步的机制可以解决多线程并发问题,在这种解决方案下,多个线程访问到的,都是同一份变量的内容.为了防止在多线程访问的过程中,可能会出现的并发错误.不得不对多个线程的访问进行同步,这样也就意味着,多个线程必须先后对变量的值进行访问或者修改,这是一种以延长访问时间来换取线程安全性的策略. 而ThreadLocal类为每一个线程都维护了自己独有的变量拷贝.每个线程都拥有了自己独立的一个变量,竞争条件被彻底消除了,那就没有任何必要对这些线程进行同步,它们也能最大限度的由CP

ThreadLocal类的理解

首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的.各个线程中访问的是不同的对象. 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new 对象 的操作来创建的对象,每个线程创建一个,不是什么对象的拷贝或副本.通过ThreadLocal.set()将这个新创建

继承FileInputFormat类来理解 FileInputFormat类

import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.fs.BlockLocation; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apa

AtomicInteger类和int原生类型自增鲜明的对比

AtomicInteger这个类的存在是为了满足在高并发的情况下,原生的整形数值自增线程不安全的问题.比如说 int i = 0 ; i++; 上面的写法是线程不安全的. 有的人可能会说了,可以使用synchronized关键字啊. 但是这里笔者要说的是,使用了synchronized去做同步的话系统的性能将会大大下降. 所以此时AtomicInteger这个类的使用就可以满足上述的情况. 当我们统计一个页面的浏览量的时候,可以使用该类来统计,而不再使用++运算符. 但是在使用的过程中,笔者发现