代码如下:
public class TicketDemo implements Runnable {private static volatile AtomicInteger ticketSum = new AtomicInteger(20);private static int finalTotal = 0;@Overridepublic void run() {int count;while ((count = ticketSum.decrementAndGet()) >= 0) {System.out.println(Thread.currentThread().getName() + "卖出了第" + ++count + "张票");finalTotal++;}}public static void main(String[] args) {Thread t1 = new Thread(new TicketDemo(), "t1");Thread t2 = new Thread(new TicketDemo(), "t2");Thread t3 = new Thread(new TicketDemo(), "t3");long startTime = System.currentTimeMillis();t1.start();t2.start();t3.start();while (true) {if (!t1.isAlive() && !t2.isAlive() && !t3.isAlive()) {long endTime = System.currentTimeMillis();System.out.println("最终售出:" + finalTotal);System.out.println("最终耗时:" + (endTime - startTime) + "毫秒.");break;}}}
}

总结:

多线程必须加上synchronized,保证不会出现并发线程同时访问的情况,而在AtomicInteger中却不用加上synchronized,AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减,AtomicInteger是在使用非阻塞算法实现并发控制,在一些高并发程序中非常适合,但并不能每一种场景都适合,不同场景要使用使用不同的数值类。

以上为AtomicInteger中的部分源码,在这里说下其中的value,这里value使用了volatile关键字,volatile在这里可以做到的作用是使得多个线程可以共享变量,但是问题在于使用volatile将使得VM优化失去作用,导致效率较低,所以要在必要的时候使用,因此AtomicInteger类不要随意使用,要在使用场景下使用。

AtomicInteger使用非阻塞算法,实现并发控制多线程实现售票相关推荐

  1. Java 理论与实践: 非阻塞算法简介——看吧,没有锁定!(转载)

    简介: Java™ 5.0 第一次让使用 Java 语言开发非阻塞算法成为可能,java.util.concurrent 包充分地利用了这个功能.非阻塞算法属于并发算法,它们可以安全地派生它们的线程, ...

  2. Java 理论与实践: 非阻塞算法简介

    在不只一个线程访问一个互斥的变量时,所有线程都必须使用同步,否则就可能会发生一些非常糟糕的事情.Java 语言中主要的同步手段就是 synchronized 关键字(也称为内在锁),它强制实行互斥,确 ...

  3. Java 理论与实践: 非阻塞算法简介--转载

    在不只一个线程访问一个互斥的变量时,所有线程都必须使用同步,否则就可能会发生一些非常糟糕的事情.Java 语言中主要的同步手段就是synchronized 关键字(也称为内在锁),它强制实行互斥,确保 ...

  4. 非阻塞算法(Lock-Free)的实现

    文章目录 非阻塞的栈 非阻塞的链表 非阻塞算法(Lock-Free)的实现 上篇文章我们讲到了使用锁会带来的各种缺点,本文将会讲解如何使用非阻塞算法.非阻塞算法一般会使用CAS来协调线程的操作. 虽然 ...

  5. 阻塞/非阻塞/同步/异步方法和多线程的关系?没有任何关系,俩不挨着

    1.阻塞非阻塞异步同步是针对方法说的,是评判一个方法运行状态的.和多线程完全两个级别. 2.阻塞非阻塞异步同步是针对方法说的,是评判一个方法运行状态的.和多线程完全两个级别. 3.阻塞非阻塞异步同步是 ...

  6. c# 非阻塞算法_C#阻塞模式和非阻塞模式

    阻塞模式 Windows套接字在阻塞和非阻塞两种模式下执行I/O操作.在阻塞模式下,在I/O操作完成前,执行的操作函数一直等候而不会立即返回,该函数所在的线程会阻塞在这里.相反,在非阻塞模式下,套接字 ...

  7. c# 非阻塞算法_c#创建非阻塞tcp通信

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  8. 非阻塞同步算法与CAS(Compare and Swap)无锁算法

    锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的.内核态的锁的时候需要操作系统进行一次上下文切换,加锁.释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放. ...

  9. java多线程11.非阻塞同步机制

    关于非阻塞算法CAS. 比较并交换CAS:CAS包含了3个操作数---需要读写的内存位置V,进行比较的值A和拟写入的新值B.当且仅当V的值等于A时,CAS才会通过原子的方式用新值B来更新V的值,否则不 ...

最新文章

  1. [转] ASP.NET MVC3 路由和多数据集的返回
  2. Linux RPM 相关
  3. pyqt5教程9:Widgets组件
  4. ▼▲Delphi面向对象编程的20条规则
  5. Java队列与栈转换中String.Valueof()使用
  6. C++基础04-类基础
  7. 大数据平台安全问题有哪些
  8. js通过codeURL画二维码
  9. pytorch DataLoader 自定义 sampler
  10. 纯注解整合SSM框架
  11. idea中各种颜色的含义
  12. Windbg线上问题分析:生产环境应用高CPU问题分析
  13. springboot从OSS下载图片并打包为压缩包下载
  14. 关于考教师资格证的一些建议——笔试篇
  15. 概述-数据建模是什么?
  16. 利用python每日自动邮件自动推送股票新闻
  17. 苹果软件更新在哪里_苹果再次为已停产的AirPort发布软件更新
  18. mysql字段掩码_什么叫掩码
  19. 搭建个人的GPS定位系统
  20. Opencv+ZBar识别条形码、二维码

热门文章

  1. javascript类型系统——正则表达式RegExp类型
  2. Azure Backup 简介
  3. 判定点是否在不规则多边形内部的问题
  4. word中取消自动目录超链接的方法
  5. 避免一个用户多次登录修改版
  6. python的datetime举例_Python datetime模块的使用示例
  7. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波11 - 直方图处理 - 使用直方图统计量增强图像
  8. vscode 预览图片 插件_真的动手写的VSCode的插件(图片浏览)之1
  9. html5监听动画结束,js判断css动画是否完成 animation,transition
  10. 使用git上传代码到github远程仓库