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值并返回加后的值

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

  1. Java线程安全计数器

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. Java线程面试题 Top 50

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

最新文章

  1. 真·降维打击:这篇SIGGRAPH 2020论文帮你「想象」三维生物眼里的四维空间
  2. Microbiome:南京农大团队在粘细菌捕食的生态学功能方面取得重要进展
  3. Python3创建目录文件夹
  4. Python 安装cx_Oracle模块折腾笔记
  5. DHCP自动分配地址;DHCP指定IP给客户端
  6. nginx+keepalived安装配置(整理中)
  7. IsWow64Process 判断操作系统位数
  8. LeetCode 1443. 收集树上所有苹果的最少时间(自底向上DFS)
  9. android的读取xml配置文件,android中XMl文件的读取
  10. Dubbo 新编程模型之外部化配置 1
  11. ArcGIS利用数据驱动工具条批量出图(python代码)
  12. 超大超详细图解,让你掌握Spark memeoryStore内存管理的精髓
  13. ASCII与unicode的转换
  14. 编程工作怎么样手工问号
  15. 分享一款在线less转css的神器
  16. 结构体C语言王者归来
  17. 影视App下载页源码
  18. 一个基于对话框的简单MFC程序分析
  19. 还不知道切图吗,工作实战手把手教你PS切图,0基础轻松掌握
  20. 31、【栈和队列】判断链表是否为中心对称(C++版)

热门文章

  1. win10关机后自动重启_电脑自动关机或重启的解决办法(笔记本)
  2. WIFI大师流量主小程序
  3. MPO和MTP连接器有什么区别?
  4. 战神引擎php启动不了,phpStudy套件版战神引擎服务端架设教程
  5. html表单注册跳转页面,出现一个问题,点击“注册”按钮页面进入注册表单后自动跳转回登录页面...
  6. 复工复产进行时 华为云WeLink——打造企业数字化的“飞轮”
  7. 一年级的小孩没有练过书法,写字写这样行吗?
  8. 阿里云启动nginx的80端口占用问题
  9. 京东23座智能物流包装园区投入运营,内部黑科技曝光
  10. GAMES103-基于物理的计算机动画入门(1~4,lab1)