所谓的原子量即操作变量的操作是“原子的”,该操作不可再分,因此是线程安全的。为何要使用原子变量呢,原因是多个线程对单个变量操作也会引起一些问题。在Java5之前,可以通过volatile、synchronized关键字来解决并发访问的安全问题,但这样太麻烦。Java5之后,专门提供了用来进行单变量多线程并发安全访问的工具包java.util.concurrent.atomic,其中的类也很简单

package unit_fifteen;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;/**
* Java线程:新特征-原子量
*
*/
public class Test {public static void main(String[] args) {ExecutorService pool = Executors.newFixedThreadPool(2); Runnable t1 = new MyRunnable("张三", 2000);Runnable t2 = new MyRunnable("李四", 3600);Runnable t3 = new MyRunnable("王五", 2700);Runnable t4 = new MyRunnable("老张", 600);Runnable t5 = new MyRunnable("老牛", 1300);Runnable t6 = new MyRunnable("胖子", 800);//执行各个线程
                pool.execute(t1); pool.execute(t2); pool.execute(t3); pool.execute(t4); pool.execute(t5); pool.execute(t6); //关闭线程池
                pool.shutdown(); }
} class MyRunnable implements Runnable {private static AtomicLong aLong =new AtomicLong(10000);        //原子量,每个线程都可以自由操作private String name;                //操作人private int x;                            //操作数额
MyRunnable(String name, int x) {this.name = name;this.x = x;} public void run() {System.out.println(name + "执行了" + x +",当前余额:" + aLong.addAndGet(x));}
}

上面是个反例,代码的结果是多变的

注意:原子量虽然可以保证单个变量在某一个操作过程的安全,但无法保证你整个代码块,或者整个程序的安全性。因此,通常还应该使用锁等同步机制来控制整个程序的安全性

package unit_fifteen;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.atomic.AtomicLong;/**
* Java线程:新特征-原子量
*
*/
public class Test {public static void main(String[] args) {ExecutorService pool = Executors.newFixedThreadPool(2); Lock lock = new ReentrantLock(false);Runnable t1 = new MyRunnable("张三", 2000,lock);Runnable t2 = new MyRunnable("李四", 3600,lock);Runnable t3 = new MyRunnable("王五", 2700,lock);Runnable t4 = new MyRunnable("老张", 600,lock);Runnable t5 = new MyRunnable("老牛", 1300,lock);Runnable t6 = new MyRunnable("胖子", 800,lock);//执行各个线程
                pool.execute(t1); pool.execute(t2); pool.execute(t3); pool.execute(t4); pool.execute(t5); pool.execute(t6); //关闭线程池
                pool.shutdown(); }
} class MyRunnable implements Runnable {private static AtomicLong aLong =new AtomicLong(10000);        //原子量,每个线程都可以自由操作private String name;                //操作人private int x;                            //操作数额private Lock lock;MyRunnable(String name, int x,Lock lock) {this.name = name;this.x = x;this.lock = lock;} public void run() {lock.lock(); System.out.println(name + "执行了" + x +",当前余额:" + aLong.addAndGet(x));lock.unlock(); }
}

转载于:https://www.cnblogs.com/yyxiangjava/p/5833721.html

Java基础之线程原子量相关推荐

  1. Java基础之线程池

    Java基础之线程池 转载于:https://www.cnblogs.com/daierge/p/10954228.html

  2. (CZ深入浅出Java基础)线程笔记

    这是刘意老师的JAVA基础教程的笔记 讲的贼好,附上传送门 传智风清扬-超全面的Java基础 一.线程的引入 1.多线程概述 进程 a.正在运行的程序,是系统进行资源分类和调用的独立单位. b.每个进 ...

  3. java基础之线程(1)

    线程 是程序中的执行线程.Java 虚拟机允许应用程序并发地运行多个执行线程. 每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程.每个线程都可以或不可以标记为一个守护程序.当某个线程中运行 ...

  4. Java基础拾遗:线程相关问题

    在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.要注意的是Thread类也实现了Runnable接口,因此,从Thread类继承的类的实例也可以作为target传入这个构 ...

  5. java线程三种方法,Java基础_线程的使用及创建线程的三种方法

    线程:线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 进程:进 ...

  6. Java基础复习---线程创建

    2019独角兽企业重金招聘Python工程师标准>>> Java提供了两种线程创建的方法: 1.Java中线程的创建 a.继承Thread类 public class Extends ...

  7. Java基础15-多线程

    1. 多线程 1.1 概念 多线程就是指一个进程中同时有多个线程正在执行. 1.2 程序.进程.线程的区别 说起进程,就不得不说下程序.程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态 ...

  8. java基础之线程概述_繁星漫天_新浪博客

    在学习线程前,我们先来学习一下进程. 进程 在一个操作系统中,每个独立执行的程序都可称为一个进程,也就是"正在运行的程序". 在计算机中,所有的应用程序都是由cpu执行的,对于一个 ...

  9. Java基础:线程池

    第一章 等待唤醒机制 1.1 线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B ...

  10. 【Java基础】线程阻塞的方法

    Thread.sleep()和Object.wait()的区别 (1)Thread.sleep()不会释放占有的锁,Object.wait()会释放占有的锁: (2)Thread.sleep()必须传 ...

最新文章

  1. 推荐一位在BAT大厂工作的技术+美女双料博主
  2. JavaWeb学习笔记(十)--HttpServletRequest
  3. Enable htaccess file work in Apache
  4. ffmpeg源码分析——av_register_all
  5. oracle中姓名取姓氏,Oracle SQL - 解析一個名稱字符串並將其轉換爲第一個姓氏和名字...
  6. 数据库SQL语句学习笔记(4)-过滤数据
  7. leetcode 767. Reorganize String | 767. 重构字符串(贪心+分桶+26路归并)
  8. 关于libtorrent库的安装
  9. 正则规则大全 JAVA
  10. samba实现linux之间文件共享,使用 samba 实现文件共享
  11. 20个it专业术语_DevSecOps这个术语是否必要?
  12. 服务器java项目转移到另一个盘_将svn的项目从一台服务器转移到另外一台服务器...
  13. Ubuntu中Zabbix安装客户端
  14. python列表知识点_列表知识点整理
  15. String变量的两种创建方式
  16. vc access mysql_VC中访问Access数据库的方法
  17. 电源大师课笔记 2.1
  18. Batch Normalization(BN层)详解
  19. 使用 DUET/REFIND 方法将 NVME 添加为引导驱动器
  20. 官方win10安装教程,win10系统一键安装方法

热门文章

  1. 自动聊天机器人项目班 [一门课搞定聊天机器人]
  2. 3dmax 视频全集
  3. JDK 动态代理和CGLIB 动态代理
  4. 联想重装系统去掉保护_联想硬盘保护系统,小编教你联想硬盘保护系统怎么安装...
  5. LayoutInflater Factory
  6. android 换机 备份,Android QQ同步助手3.7:资料备份让换机刷机无忧
  7. 3种方法解除RAR压缩文件的密码保护
  8. python画流程_使用Graphviz快速绘制流程图
  9. 杀软和防火墙简单列表
  10. c语言工程师专业分析,一个资深c语言工程师说如何学习c语言.pdf