当前位置: 首页 > news >正文

Oracle官方并发教程之原子变量

原文地址,译文地址 ,译者:李任,校对:郑旭东

java.util.concurrent.atomic包定义了对单一变量进行原子操作的类。所有的类都提供了get和set方法,可以使用它们像读写volatile变量一样读写原子类。就是说,同一变量上的一个set操作对于任意后续的get操作存在happens-before关系。原子的compareAndSet方法也有内存一致性特点,就像应用到整型原子变量中的简单原子算法。

为了看看这个包如何使用,让我们返回到最初用于演示线程干扰的Counter类:


class Counter {
    private int c = 0;
    public void increment() {
        c++;
    }

    public void decrement() {
        c--;
    }

    public int value() {
        return c;
    }
}


使用同步是一种使Counter类变得线程安全的方法,如SynchronizedCounter:


class SynchronizedCounter {
    private int c = 0;
    public synchronized void increment() {
        c++;
    }
    public synchronized void decrement() {
        c--;
    }
    public synchronized int value() {
        return c;
    }
}


对于这个简单的类,同步是一种可接受的解决方案。但是对于更复杂的类,我们可能想要避免不必要同步所带来的活跃度影响。将int替换为AtomicInteger允许我们在不进行同步的情况下阻止线程干扰,如AtomicCounter:


import java.util.concurrent.atomic.AtomicInteger;
class AtomicCounter {
    private AtomicInteger c = new AtomicInteger(0);
    public void increment() {
        c.incrementAndGet();
    }

    public void decrement() {
        c.decrementAndGet();
    }

    public int value() {
        return c.get();
    }


相关文章:

  • 解决Xcode 7编译错误:does not contain bitcode
  • 《写一个程序,用于分析一个字符串中各个单词出现的频率,并将单词和它出现的频率输出显示》...
  • jQuery全屏背景图片导航
  • 学习进度表
  • 各种加解密算法简介
  • Kafka源码分析之Sender
  • 2016 Google hosts 持续更新【更新于:2016-04-10】
  • 学C#你应该熟练使用ILDasm和Reflector【带视频教程】
  • 《Linux内核设计与实现》第八周读书笔记——第四章 进程调度
  • 关于java写进mysql中文乱码问题
  • 从客户端(?)中检测到有潜在危险的 Request.Path 值 的解决方案
  • 最少换乘
  • rpm命令使用总结
  • 学习ios【1】Objective-C 基本语法
  • Mac使用大全
  • 2017年终总结、随想
  • angular2开源库收集
  • CEF与代理
  • MySQL数据库运维之数据恢复
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • 从零搭建Koa2 Server
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​香农与信息论三大定律
  • #传输# #传输数据判断#
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (转)c++ std::pair 与 std::make
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 表达式计算:Expression Evaluator
  • .NET 反射 Reflect
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @软考考生,这份软考高分攻略你须知道
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [AIGC] Redis基础命令集详细介绍
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
  • [c++] C++多态(虚函数和虚继承)
  • [GDMEC-无人机遥感研究小组]无人机遥感小组-000-数据集制备
  • [Java算法分析与设计]--线性结构与顺序表(List)的实现应用
  • [leetcode 数位计算]2520. 统计能整除数字的位数
  • [Linux] Linux入门必备的基本指令(不全你打我)
  • [Lucas定理]【学习笔记】
  • [Oh My C++ Diary]用cout输出时后endl的使用
  • [one_demo_6]逆置整数
  • [PHP] 算法-顺时针打印矩阵的PHP实现
  • [Power Query] 分组依据
  • [pytorch入门] 2. tensorboard
  • [QT]加快qt编译:设置默认多核编译qt
  • [RK3566-Android11] 关于 a2dpsink -蓝牙支持接收播放/无PIN码连接
  • [SE]软件项目需求分析为什么困难
  • [Step By Step]SAP HANA创建属性视图(Attribute View)
  • [Study]Vue