java 原子类_Java并发编程九 同步之原子类(Atomic类)

news/2024/7/5 6:42:55

1、什么是原子类?什么情况下使用原子类?

java 1.5引进原子类,具体在java.util.concurrent.atomic包下,atomic包里面一共提供了13个类,分为4种类型,分别是:原子更新基本类型,原子更新数组,原子更新引用,原子更新属性。原子类也是java实现同步的一套解决方案。

既然已经有了synchronized关键字和lock,为什么还要引入原子类呢?或者什么场景下使用原子类更好呢?

在很多时候,我们需要的仅仅是一个简单的、高效的、线程安全的递增或者递减方案,这个方案一般需要满足以下要求:

1、 简单:操作简单,底层实现简单

2、 高效:占用资源少,操作速度快

3、 安全:在高并发和多线程环境下要保证数据的正确性

对于是需要简单的递增或者递减的需求场景,使用synchronized关键字和lock固然可以实现,但代码写的会略显冗余,且性能会有影响,此时用原子类更加方便。

面试的时候可以举meterService添加监控项的例子,walGet、walAcl,起一个周期线程池调用sdk往CMC提交数据,参考举周写的。

2、原子类如何使用

上面介绍了原子类有4大类,这里以原子更新基本类型中的AtomicInteger类为例,介绍通用的API接口和使用方法。

首先是几个常用的API:

// 以原子方式将给定值与当前值相加,可用于线程中的计数使用,(返回更新的值)。

还是举那个同步问题的经典例子,定义一个临界变量val,起10个异步线程,每个线程都是对这个临界变量进行1000次自增操作,如下:

package 

运行结果有时为我们期望的10000,有时候比10000少,比如9408,出现比10000少的结果是因为自增操作++i不是原子操作,出现了竞争,需要对临界变量做同步处理。

使用synchronized关键字和lock固然可以实现,但这里只是对临界变量val++时做同步处理,有种高射炮打蚊子的感觉,且加锁后势必会对性能有所印象,这种场景正是我们使用Atomic类的场景,如下:

package 

这里我们使用了AtomicInterger类的increamentAndGet方法,以原子方式将当前值加 1(返回更新的值),结果自然是每次运行都打印10000,可以看到代码写起来很简洁,很轻量级。

这里的API估计我用的时候还得再看看,因为用的也不多,所以知道怎么用API,到时候再查一下用就行。

3、原子类的原理

请参考链接2。

参考

java中Atomic变量的实现原理是怎样的?​www.zhihu.com
b73a726b15d98939584fdd269fcd562f.png
张舰:Java并发编程十五 乐观锁和悲观锁​zhuanlan.zhihu.com

http://www.niftyadmin.cn/n/3780521.html

相关文章

html中显示变量的数组,HTML5引入的新数组TypedArray介绍

Javascript中的数组是个强大的家伙:你可以创建的时候不规定长度,而是动态的去改变长度。你可以把他当成普通的数组去读取,也可以当他是堆栈来使用。你可以改变数组中每个元素的值甚至是类型。好吧,其实他是一个对象,比…

创建线程的三种方法_Java中创建线程的两个方法

1 方法1&#xff1a;新建一个类继承Threadpublic class FirstThreadTest {public static void main(String[] args) {MyThread mt new MyThread();mt.start();for (int i 1;i<10; i){System.out.println(Thread.currentThread().getName() "输出"i);}} }class …

tp路由+伪静态+去掉index.php

浏览&#xff1a;10536 发布日期&#xff1a;2013/10/08 分类&#xff1a;技术分享 关键字&#xff1a; 路由 伪静态 去掉index.php之前一个网友说能不能达到这样的效果,www.olcms.com/news/id.html我当时说不能&#xff0c;后来想了想是可以的&#xff0c;今天试了试&#x…

EXT.NET GridPanel 鼠标经过时字体加粗以及改变颜色

2019独角兽企业重金招聘Python工程师标准>>> .x-grid-row-over .x-grid-cell-inner { font-weight: bold; background-color: #C1FFC1; } 转载于:https://my.oschina.net/u/2446847/blog/1536309

2020年计算机网络成就有哪些,高通CES分享最新成就,2020年将会是5G关键一年

[PConline 资讯]高通作为知名网络通讯技术企业&#xff0c;致力于将更多先进的通讯技术带给用户。在2020年的CES大会上&#xff0c;高通召开新闻发布会&#xff0c;详细回顾了这一年多来取得的成就&#xff0c;分享了在移动、PC、汽车、边缘云领域的进展&#xff0c;同时也聚焦…

lnk200无法解析的外部符号_Java File I/O 中的Path核心接口及外部存储扩展

Path相关核心API1、Paths作为工具类&#xff0c;简化Path的创建过程。通过FileSystem创建平台相关的Path。2、FileSystems作为工具类&#xff0c;简化FileSystemProvider&#xff0c;以及相应FileSystem的创建过程。1)获取默认系统参数、Uri、Path的FileSystemProvider2)通过pr…

u盘装系统学计算机好,用U盘快速装电脑系统详细教程,几分钟就装完!

大家好&#xff0c;我是学姐。今天是正月十五&#xff0c;祝大家元宵节快乐&#xff01;今晚据说还有超级大月亮&#xff0c;在23时54分&#xff0c;大家别忘了看月亮哈。好啦&#xff0c;不说了&#xff0c;再说就跑题了&#xff0c;还是跟大家聊聊正事吧&#xff01;昨天学姐…

java Web监听器导图详解

监听器是JAVA Web开发中很重要的内容&#xff0c;其中涉及到的知识&#xff0c;可以参考下面导图&#xff1a; Web监听器 1 什么是web监听器&#xff1f; web监听器是一种Servlet中的特殊的类&#xff0c;它们能帮助开发者监听web中的特定事件&#xff0c;比如ServletContext,H…