1.AtomicLong原子类

AtomicLong

AtomicLong是作用是对长整形进行原子操作。

属于package java.util.concurrent.atomic;

AtomicLong使用了Unsafe类,Unsafe类提供了硬件级别的原子操作。(对其内容,将在下次说明)

public class AtomicLong extends Number implements java.io.Serializable {
    private static final long serialVersionUID = 1927816293512124184L;

// setup to use Unsafe.compareAndSwapLong for updates
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset;

/**
 * Records whether the underlying JVM supports lockless
 * compareAndSwap for longs. While the Unsafe.compareAndSwapLong
 * method works in either case, some constructions should be
 * handled at Java level to avoid locking user-visible locks.
 */
static final boolean VM_SUPPORTS_LONG_CAS = VMSupportsCS8();

/**
 * Returns whether underlying JVM supports lockless CompareAndSet
 * for longs. Called only once and cached in VM_SUPPORTS_LONG_CAS.
 */
private static native boolean VMSupportsCS8();

static {
  try {
    valueOffset = unsafe.objectFieldOffset
        (AtomicLong.class.getDeclaredField("value"));//获取一个内存地址的偏移量
  } catch (Exception ex) { throw new Error(ex); }
}

private volatile long value;

//构造值为 initialValue的AtomicLong对象
public AtomicLong(long initialValue) {
    value = initialValue;
}

//默认构造函数
public AtomicLong() {
}

//获取当前值
public final long get() {
    return value;
}
//设置为newValue
public final void set(long newValue) {
    value = newValue;
}

//延迟设为newValue。值期间会改变,最终设置为给定的值。
public final void lazySet(long newValue) {
    unsafe.putOrderedLong(this, valueOffset, newValue);//设置对象中valueOffset偏移地址对应的object型field的值为指定值
}

//原子方式设置为当前值,返回原先的值。
public final long getAndSet(long newValue) {
    while (true) {
        long current = get();
        if (compareAndSet(current, newValue))
            return current;
    }
}

// 如果当前值 == expect,则以原子方式将该值设置为update。更改成功返回true,否则返回false且不修改原值。
public final boolean compareAndSet(long expect, long update) {
    return unsafe.compareAndSwapLong(this, valueOffset, expect, update);
}

//其实和上面的方法一样。
public final boolean weakCompareAndSet(long expect, long update) {
    return unsafe.compareAndSwapLong(this, valueOffset, expect, update);
}

//原子自增,返回原值
public final long getAndIncrement() {
    while (true) {
        long current = get();
        long next = current + 1;
        if (compareAndSet(current, next))
            return current;
    }
}

 //原子自减,返回原值
public final long getAndDecrement() {
    while (true) {
        long current = get();
        long next = current - 1;
        if (compareAndSet(current, next))
            return current;
    }
}

//原子增delta,返回原值
public final long getAndAdd(long delta) {
    while (true) {
        long current = get();
        long next = current + delta;
        if (compareAndSet(current, next))
            return current;
    }
}

 //原子自增,返回新值
public final long incrementAndGet() {
    for (;;) {
        long current = get();
        long next = current + 1;
        if (compareAndSet(current, next))
            return next;
    }
}

 //原子自减,返回新值
public final long decrementAndGet() {
    for (;;) {
        long current = get();
        long next = current - 1;
        if (compareAndSet(current, next))
            return next;
    }
}

  //原子增delta,返回新值
public final long addAndGet(long delta) {
    for (;;) {
        long current = get();
        long next = current + delta;
        if (compareAndSet(current, next))
            return next;
    }
}

//返回String类型
public String toString() {
    return Long.toString(get());//对象转换
}

//返回int类型数值
public int intValue() {
    return (int)get();
}
//返回long类型数值
public long longValue() {
    return get();
}
//返回float类型数值
public float floatValue() {
    return (float)get();
}
//返回double类型数值
public double doubleValue() {
    return (double)get();
}

}

补充说明:
1.while(true),for(;;):乐观锁实现,volatile+CAS实现,更新不成功继续循环更新,效率比每次都加锁(悲观锁)高很多的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容

  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,681评论 0 11
  • JDK中的java.util.concurrent.atomic包提供了一系列支持无锁线程安全修改操作的基础变量。...
    Justlearn阅读 914评论 0 2
  • 一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这么写 publicclassUnsa...
    Martin说阅读 2,196评论 0 6
  • 四月的武汉,闷热伴随着雨季一块儿袭来,折腾了两天的实验结果结果却让人欲哭无泪,心情自然也随之使然。 拖沓的...
    米格拉阅读 493评论 0 0
  • 作为一名教育工作者,我真的觉得很惭愧,无论是教育学生还是教育自己的孩子,我都没有什么经验,没有更好的办法。作...
    alisha123阅读 374评论 0 0