深圳Java学习:Java中的原子操作

来到千锋学习Java已经有一段时间了,由当初的懵逼状态逐渐好转,也逐渐养成了写技术学习笔记的习惯,今天总结了一下Java中的原子操作。
1、Java中的原子操作是什么?
所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间切换到另一个线程。
2、Java中的原子操作介绍:
jdk1.5的包为Java.util.concurrent.atomic
这个包里面提供了一组原子类。其基本特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性。
即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择另一个线程进入,这只是一种逻辑上的理解。实际上是借助硬件的相关指令来实现的,但不会阻塞线程(synchronized 会把别的等待的线程挂,或者说只是在硬件级别上阻塞了)。
其中的类可以分成4组

  • AtomicBoolean,AtomicInteger,AtomicLong,AtomicReference
  • AtomicIntegerArray,AtomicLongArray
  • AtomicLongFieldUpdater,AtomicIntegerFieldUpdater,AtomicReferenceFieldUpdater
  • AtomicMarkableReference,AtomicStampedReference,AtomicReferenceArray
    Atomic类的作用
  • 使得让对单一数据的操作,实现了原子化
  • 使用Atomic类构建复杂的,无需阻塞的代码
  • 访问对2个或2个以上的atomic变量(或者对单个atomic变量进行2次或2次以上的操作)通常认为是需要同步的,以达到让这些操作能被作为一个原子单元。
    AtomicBoolean , AtomicInteger, AtomicLong, AtomicReference 这四种基本类型用来处理布尔,整数,长整数,对象四种数据。
  • 构造函数(两个构造函数)
    • 默认的构造函数:初始化的数据分别是false,0,0,null
    • 带参构造函数:参数为初始化的数据
  • set( )和get( )方法:可以原子地设定和获取atomic的数据。类似于volatile,保证数据会在主存中设置或读取
  • getAndSet( )方法
    • 原子的将变量设定为新数据,同时返回先前的旧数据
    • 其本质是get( )操作,然后做set( )操作。尽管这2个操作都是atomic,但是他们合并在一起的时候,就不是atomic。在Java的源程序的级别上,如果不依赖synchronized的机制来完成这个工作,是不可能的。只有依靠native方法才可以。
  • compareAndSet( ) 和weakCompareAndSet( )方法
    • 这两个方法都是conditional modifier方法。这2个方法接受2个参数,一个是期望数据(expected),一个是新数据(new);如果atomic里面的数据和期望数据一致,则将新数据设定给atomic的数据,返回true,表明成功;否则就不设定,并返回false。
  • 对于AtomicInteger、AtomicLong还提供了一些特别的方法。getAndIncrement( )、incrementAndGet( )、getAndDecrement( )、decrementAndGet ( )、addAndGet( )、getAndAdd( )以实现一些加法,减法原子操作。(注意 --i、++i不是原子操作,其中包含有3个操作步骤:第一步,读取i;第二步,加1或减1;第三步:写回内存)。

深圳Java学习:Java中的原子操作相关推荐

  1. [Java]学习Java(1)运算符语句类

    [Java]学习Java(1)运算符&语句&类 一.运算符&语句 1.相等运算符"==" (1)基本类型时值相等就为true (2)对象比较时比较其引用地址 ...

  2. Java学习-Java语言基础

    Java学习-Java语言基础 1.Java符号集  1.1Java标识符  1.2关键字  1.3分割符和注释 2.java 数据类型  2.1整型   2.1.1整型常量   2.1.2整型变量 ...

  3. 03搭建JAVA环境——java学习——java初学者专题教程

    03搭建JAVA环境--java学习--java初学者专题教程 第一步:进入ORACLE官网 http://www.oracle.com/index.html 第二步:进入下载页面下载JDK版本,建议 ...

  4. Java学习-Java的输入输出

    文章目录 写在前面 一.数据流概念&划分 1.1 数据流的概念 1.2 数据流的划分 1.3 输入输出系统的关系结构 二.文件类:File类 2.1 File类简介 2.2 通过File类对文 ...

  5. java学习-http中get请求的非ascii参数如何编码解码探讨

    # 背景: 看着别人项目代码看到一个PathUtils工具类, 里面只有一个方法,String  rebuild(String Path),将路径进行URLDecoder.decode解码,避免路径中 ...

  6. Java学习 --- 设计模式中的UML类图

    目录 一.什么是UML 二.UML图分类 三.UML类图 3.1.依赖关系 3.2.泛化关系 3.3.实现关系 3.4.关联关系 3.5.聚合关系 3.6.组合关系 一.什么是UML 1.UML(统一 ...

  7. JAVA学习-JAVA实现对象描述(java面向对象特性)

    JAVA实现对象描述 经典案例:描述一个人类: 要求此人类必须包含有人的姓名.性别.出生日期等基本属性(变量). 要求此人类描述吃饭的方法(函数)和描述睡觉的方法(函数).例如睡觉方法的执行体为一个 ...

  8. Java学习——java语言概述

    一. 基础常识 编程的本质=数据结构+算法 数据结构:数据结构是计算机存储.组织数据的方式 算法:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算 法代表着用系 ...

  9. 【转】Java学习---Java Web基础面试题整理

    [原文]https://www.toutiao.com/i6592359948632457731/ 1.什么是Servlet? 可以从两个方面去看Servlet: a.API:有一个接口servlet ...

  10. java继承与实现的_[Java学习] Java继承的概念与实现

    继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承(例如儿子继承父亲财产)类似. 继承可以理解为一个类从另一个类获取方法和属性的过程.如果类B继承于类A,那么B就拥有A的方法和属性. ...

最新文章

  1. Ubuntu 14.04 64位上安装wps office软件
  2. trigger error php,php trigger_error函数怎么用
  3. 有向图的拓扑排序的理解和简单实现(Java)
  4. Linux服务器的架设 (DHCP,NIS,SAMBA,FTP,DNS)
  5. C++map容器-查找和统计
  6. (转)淘淘商城系列——中文分析器IK-Analyzer的使用
  7. Windows Server 2016补丁更新机制
  8. Java 利用 split 方法切割字符串
  9. 墨者学院 - IIS写权限漏洞分析溯源
  10. 计算机考研数据结构代码题总结--Day01
  11. 《富爸爸穷爸爸》读书笔记 - 为什么要教授财务知识
  12. 电商设计——3、点线面及光影
  13. mathematics中如何计算排列组合
  14. 无线广告屏]无线模块
  15. Html+CSS 文本的强制换行
  16. 静态路由关联下一跳与出接口
  17. 三维点云语义分割模型介绍
  18. DELL 6248交换机常用配置示例
  19. RK3399驱动开发 | 04 - WK2124串口芯片驱动浅析
  20. Android 调节屏幕亮度(当前应用和系统亮度)

热门文章

  1. c#调用COM组件时报“没有注册类”(0x80040154)错误
  2. 网络安全实验室--上传关
  3. 家常土豆泥饼制作方法步骤图解
  4. Latex指定表格某行的行高
  5. CSS flex的一些属性
  6. Activiti6--入门学习--结束事件
  7. python数据分析 - 关联规则Apriori算法
  8. USF MSDS501 计算数据科学中文讲义 2.3 计算模型
  9. 利用单片机串口实现甲乙两机的数据传输
  10. Powershell 拆分和合并PDF