synchronized和volatile关键字的区别:

   (1)synchronized关键字保证了多个线程对于同步块是互斥的,synchronized作为一种同步手段,解决java多线程的执行有序性和内存可见性,而volatile关键字只解决多线程的内存可见性问题;(2)volatile关键字是java提供的一种同步手段,只不过它是轻量级。volatile只能保证多线程的内存可见性,不能保证多线程的执行有序性。而最彻底的同步要保证有序性和可见性,例如synchronized。任何被volatile修饰的变量,都不拷贝副本到工作内存,任何修改都及时写在主存。因此对于Valatile修饰的变量的修改,所有线程马上就能看到,但是volatile不能保证对变量的修改是有序的。

AtomicInteger介绍
AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减。

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

public class Test2 {

public static AtomicInteger count = new AtomicInteger(0);public static void main(String[] args) throws InterruptedException {for (int i = 0; i < 100; i++) {new Thread() {public void run() {for (int j = 0; j < 100; j++) {count.getAndIncrement();}}}.start();}Thread.sleep(1000);System.out.println("AtomicInteger count: " + count);
}

}
原子更新基本类型

atomic包下提供了AtomicBoolean/AtomicLong/AtomicInteger三个原子更新基本类型,以AtomicInteger为例,其他两种基本类似。以下是AtomicInteger囊括的大致方法

public final int getAndSet(int newValue) //给AtomicInteger设置newValue并返回加oldValue
public final boolean compareAndSet(int expect, int update) //如果输入的值和期望值相等就set并返回true/false
public final int getAndIncrement() //对AtomicInteger原子的加1并返回当前自增前的value
public final int getAndDecrement() //对AtomicInteger原子的减1并返回自减之前的的value
public final int getAndAdd(int delta) //对AtomicInteger原子的加上delta值并返加之前的value
public final int incrementAndGet() //对AtomicInteger原子的加1并返回加1后的值
public final int decrementAndGet() //对AtomicInteger原子的减1并返回减1后的值
public final int addAndGet(int delta) //给AtomicInteger原子的加上指定的delta值并返回加后的值


作者:放学等我别走
来源:CSDN
原文:https://blog.csdn.net/weixin_40760196/article/details/82216173
版权声明:本文为博主原创文章,转载请附上博文链接!

Java-线程安全的计数器相关推荐

  1. Java线程安全的计数器

    synchronized和volatile关键字的区别: (1)synchronized关键字保证了多个线程对于同步块是互斥的,synchronized作为一种同步手段,解决java多线程的执行有序性 ...

  2. Java线程安全计数器

    三种方式实现计数器 1.简介说明 1.简介说明 这篇博客主要记录下Java在多线程情况下,集中线程安全的计数器的一个实现.主要使用了三种不同的方式实现. synchronized方式,排它锁.独占锁. ...

  3. 2017年50道Java线程面试题

    下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编 ...

  4. Java线程面试题 Top 50(转)

    不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程 ...

  5. 【多线程】Java线程面试题 Top 50(转载)

    Java线程面试题 Top 50 原文链接:http://www.importnew.com/12773.html 本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎加入 ...

  6. Java 线程同步组件 CountDownLatch 与 CyclicBarrier 原理分析

    1.简介 在分析完AbstractQueuedSynchronizer(以下简称 AQS)和ReentrantLock的原理后,本文将分析 java.util.concurrent 包下的两个线程同步 ...

  7. Java线程详解(14)-信号量

    Java的信号量实际上是一个功能完毕的计数器,对控制一定资源的消费与回收有着很重要的意义,信号量常常用于多线程的代码中,并能监控有多少数目的线程等待获取资源,并且通过信号量可以得知可用资源的数目等等, ...

  8. Java线程详解(10)-volatile关键字

    Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 synchronized 块相比,volatile 变量所需的编码较少,并 ...

  9. Java线程新特征——Java并发库

    一.线程池   Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...

  10. Java线程面试题 Top 50

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 不管你是新程序员还是老手,你一定在面试 ...

最新文章

  1. python一年365天、初始水平值_2020年11月7日,20201107
  2. hdu 5419(数学期望)
  3. 巡逻机器人用应用的pc端车牌识别
  4. java scanner转string,Java InputStream to String 转化
  5. Java比较器之Comparable接口与Comparator接口的使用
  6. Flutter中使用友盟统计
  7. jgGrid常用操作--持续更新
  8. 【C++】R进制转10进制,10进制转R进制
  9. bmfont-instructions
  10. vs vsvim viemu vax 备忘
  11. 如何将硬盘系统完整拷贝到另一硬盘?
  12. 计量模型 | 固定效应与交互固定效应
  13. SQLite Expert查看SQLite数据库文件没有数据的问题
  14. PNG-的IDAT解析
  15. 2018全美程序员薪资报告新鲜出炉!
  16. 我国南极泰山站正式建成开站
  17. [图论]---[网络流]---最小点割数/最小点割集
  18. 论文解读 X-CLIP : Expanding Language-Image Pretrained Models for General Video Recognition
  19. 微信小程序实战(一)---实现登录界面
  20. ISeeYou:一款基于Bash和Javascript开发的社会工程学网络钓鱼工具

热门文章

  1. Springboot配置SSL(https)
  2. React Router缓存路由
  3. 输入大写字母,输出大小写字母及其对应的ASCII码;输入语句,将大写字母变成小写字母;将句子中每个单词的第一个字母转换为大写字母;输入一串字符,分别算出英文字母、空格、数字、其他字符的个数(C)
  4. 机器学习中神经网络,支持向量机以及贝叶斯分类器总结
  5. leafletjs 热力图_LeaFlet学习之热力图
  6. 均匀分布的概率密度函数和分布函数学习笔记1
  7. 前程无忧——爬虫+数据分析
  8. mysql --- mongodb --- nginx 知识点总结
  9. 基于QT实现Mp3播放器(理论论述部分)
  10. 小学知识点~句式全覆盖专题