Atomic系列类

Atomic系列类别

Atomic系列类封装了一系列的基础类型和对象操作,其主要目的就是为了实现原子性,主要核心类如下

  • AtomicInteger
  • AtomicLong
  • AtomicBoolean
  • AtomicIntegerArray
  • AtomicLongArray
  • AtomicReference 原子性的引用对象
  • 在对Atomic类操作的时候,如果是有多个操作执行,那么就是非原子性的,需要加synchronized进行修饰,保证Atomic类操作整体原子性
package com.example.core.cas;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;public class UseAtomic {private static /* int count = 0*/AtomicInteger count = new AtomicInteger(0);public synchronized int add(){//使用synchronized关键字使得多个操作合并在一起,形成一个整体//return count.addAndGet(10);将+1+2+3+4代替+10,模拟多个操作count.addAndGet(1);count.addAndGet(2);count.addAndGet(3);count.addAndGet(4);return count.get();}public static void main(String[] args) {UseAtomic ua = new UseAtomic();List<Thread> list = new ArrayList<>();//如果使用atomicInteger最终结果一定是1000for (int i=0;i<100;i++){list.add(new Thread(new Runnable() {@Overridepublic void run() {System.out.println("累计结果:"+ua.add());}}));}for(Thread t:list){t.start();}}
}

另一个例子 

  • Person.class
package com.example.core.cas;public class Person {private String name;private int age;public Person(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String toString() {return "[name: " + this.name + ", age: " + this.age + "]";}
}
  • 多个线程抢占同一份资源,会造成问题
package com.example.core.cas;public class UseAtomicReference1 {private static Person person;public static void main(String[] args) throws InterruptedException {person = new Person("Tom", 18);System.out.println("Person is " + person.toString());Thread t1 = new Thread(new Task1());Thread t2 = new Thread(new Task2());t1.start();t2.start();t1.join();t2.join();Thread.sleep(100);System.out.println("Now Person is " + person.toString());}static class Task1 implements Runnable {public void run() {person.setAge(19);person.setName("Tom1");System.out.println("Thread1 Values "+ person.toString());}}static class Task2 implements Runnable {public void run() {person.setAge(20);person.setName("Tom2");System.out.println("Thread2 Values "+ person.toString());}}}
  • 使用Atomic,如果两个线程逐次访问并修改资源,可以保证数据一致性;如果同时访问,其中一个就会返回false,不修改数据
  • 避免产生并发行
package com.example.core.cas;import java.util.concurrent.atomic.AtomicReference;public class UseAtomicReference2 {// 普通引用private static Person person;// 原子性引用private static AtomicReference<Person> aRperson;public static void main(String[] args) throws InterruptedException {person = new Person("Tom", 18);aRperson = new AtomicReference<Person>(person);System.out.println("Atomic Person is " + aRperson.get().toString());Thread t1 = new Thread(new Task1());Thread t2 = new Thread(new Task2());t1.start();t2.start();t1.join();t2.join();Thread.sleep(500);System.out.println("Now Atomic Person is " + aRperson.get().toString());}static class Task1 implements Runnable {  public void run() {System.err.println("ret = " + // C A S 原子操作aRperson.compareAndSet(  //10ms aRperson.get(), //如果满足我的预期,就进行修改;不满足就不修改new Person("Tom", aRperson.get().getAge() + 1)));System.out.println("Thread1 Atomic References "+ aRperson.get().toString());}}static class Task2 implements Runnable {public void run() {System.err.println("ret = " + aRperson.compareAndSet(		//8msaRperson.get(), //如果满足我的预期,就进行修改;不满足就不修改new Person("Tom", aRperson.get().getAge() + 2)));System.out.println("Thread2 Atomic References "+ aRperson.get().toString());}}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 系统学习笔记(十二)---os os.path os.walk

得到当前工作目录&#xff0c;即当前 Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir()函数用来删除一个文件:os.remove()删除多个目录&#xff1a;os.removedirs&#xff08;r“c&#xff1a;\python”&#xff09;检验给出的路径是否是…

Java JUC工具类--CountDownLatch

CountDownLatch&#xff1a;用于监听某些初始化操作&#xff0c;并且线程进行阻塞&#xff0c;等初始化执行完毕后&#xff0c;通知主线程继续工作执行 package com.example.core.juc;import java.util.concurrent.CountDownLatch;public class UseCountDownLatch {public stat…

Java JUC工具类--CyclicBarrier

CyclicBarrier&#xff1a;栅栏的概念&#xff0c;多线程的进行阻塞&#xff0c;等待某一个临界值条件满足后&#xff0c;同时执行 类比&#xff1a;每个线程代表一个跑步运动员&#xff0c;当运动员都准备好后&#xff0c;才一起出发&#xff0c;只要有一个人没有准备好&#…

人生感悟:人生像吃自助餐

问我怎样管理欲望&#xff0c;过简单生活?我的答案是&#xff1a;你要先学会品味人生&#xff0c;品味的同义词&#xff0c;就叫做体悟内涵。 人为什么有这么多欲望?其实&#xff0c;我们每个人在一个社会&#xff0c;就像进入一个自助餐(buffet)店&#xff0c;食物非常的多…

Java JUC工具类--Future

Future模式&#xff0c;也是非常经典的设计模式&#xff0c;这种模式主要就利用空间换时间的概念&#xff0c;也就是说异步执行&#xff08;需要开启一个新的线程&#xff09;在互联网高并发的应用服务中&#xff0c;我们随处可见这种理念和代码&#xff0c;主要就是使用了这种…

职场与生活 八条原则 让你不再浪费时间和提高效率

Heidi Roizen女士一度是硅谷人人争相学习的典范。她曾创办自己的公司并管理了14年之久。后来&#xff0c;她担任苹果公司主管开发者关系的高级副总裁。现在&#xff0c;她是DFJ Venture的一位风投家&#xff0c;她还在斯坦福主讲一门名叫‌‌“企业家精神‌‌”的课程。她几乎认…

Java JUC工具类--Exchanger

Exchanger Exchanger用于进行线程间的数据交换&#xff0c;它提供一个同步点&#xff0c;在这个同步点&#xff0c;两个线程可以交换彼此的数据两个线程通过exchange方法交换数据&#xff0c;如果一个线程先执行exchange方法&#xff0c;它会一直等待第二个线程也执行exchang…

爸爸的素质决定孩子飞多高,爸爸们请反复看!!!

好父亲等于200个好老师&#xff0c;当爹的都好好看看&#xff0c;以后孩子不给力别怨别人! 孩子是父亲的影子&#xff0c;希望每个阅读完全文的父亲&#xff0c;都能成为一个好父亲。 NO.1爸爸是孩子最好的老师 爸爸的素质有多高&#xff0c;孩子就能飞多高 用理性的父爱帮…

Java JUC工具类--ForkJoin

ForkJoin Fork/Join框架是JAVA7提供的一个用于并行执行任务的框架&#xff0c;是一个把大任务分割成若干个小任务&#xff0c;最终汇总每个小任务结果后得到大任务结果的框架Fork/Join中两个重要的类 ForkJoinTask&#xff1a;使用该框架&#xff0c;需要创建一个ForkJoin任务…

修复bug的12个关键步骤

要多少时间才能修复bug&#xff0c;事先是很难知道的&#xff0c;特别是如果你和这些代码还素不相识的话&#xff0c;情况就更加扑朔迷离了。James Shore在《The Art of Agile 》一书中&#xff0c;明确指出要想修复问题得先知道问题的所在。而我们之所以无法准确估计时间是因为…

Java JUC工具类--Master-Worker

Master-Worker Master-Worker模式是常用的并行计算模式。它的核心思想是系统由两类进程协作工作&#xff1a;Master进程和Worker进程Master负责接收和分配任务&#xff0c;Worker负责处理子任务当各个Worker子进程处理完成后&#xff0c;会将结果返回给Master&#xff0c;由Ma…

身体打来的电话,你一定要接!

心脏有问题时。左边手臂会酸、麻、痛。肝脏有问题时。小腿晚上睡觉时容易抽筋。肾脏出现问题时。声音就会出不来&#xff0c;就会沙哑。脾胃出现问题时。偏头痛。附&#xff1a;五脏排毒最简单有效的方法 一、心脏有问题时 1。呼吸会不顺畅&#xff0c;胸口会闷也会刺痛&…

Java JUC工具类--Semaphore

Semaphore 在Semaphore信号量非常适合高并发访问限制&#xff0c;新系统在上线之前&#xff0c;要对系统的访问量进行评估&#xff0c;评估是经过以往的经验、数据、历年的访问量&#xff0c;已经推广力度进行一个合理的评估当然评估标准不能太大也不能太小&#xff0c;太大的…

python 基础知识点整理 和具体应用

Python教程 Python是一种简单易学&#xff0c;功能强大的编程语言。它包括了高效的高级数据结构和简单而有效的方法&#xff0c;面向对象编程。Python优雅的语法&#xff0c;动态类型&#xff0c;以及它天然的解释能力&#xff0c;使其成为理想的语言&#xff0c;脚本和应用程序…

Java 线程池相关问题

线程池的拒绝策略 AbortPolicy&#xff1a;直接抛出异常阻止系统正常工作。CallerRunsPolicy&#xff1a;只要线程池未关闭&#xff0c;该策略直接在调用者线程中&#xff0c;运行当前被丢弃的任务。DiscardOldestPolicy&#xff1a;丢弃最老的一个请求&#xff0c;尝试再次提…

对编程人员我想说:多做 多实践 多写代码

有很多人问我&#xff0c;怎样提高自己的能力&#xff1f;有初学者&#xff0c;有水平达到一定程度的程序员。 我想说&#xff0c;不要过多的看代码&#xff0c;看计算机理论&#xff0c;看别人写的文章&#xff0c;代码等&#xff0c;最重要的是自己理解了某个原理&#xff0c…

读人是基础,看人是关键,做人最重要

人生在世&#xff0c;读人是基础&#xff0c;看人是关键&#xff0c;做人最重要。 一、读人——一个人就是一本书。读人&#xff0c;比读其他文字的书更难。在生活中&#xff0c;每个人都是书&#xff0c;每人又都是读者。我们认认真真地读&#xff0c;读了大半辈子&#xff0c…

使用postman模拟百度通用文字识别

1&#xff0c;登录百度AI开放平台 百度AI网站新手指南链接在顶部导航栏中&#xff0c;找到控制台选项&#xff0c;输入账号和密码&#xff0c;进入管理中心页面在管理中心页面中&#xff0c;找到文字识别的选项找到创建应用的选项&#xff0c;进行ocr项目的创建需要输入应用的…

3个观念 不再瞎学习!

此刻&#xff0c;你应该要做什么准备&#xff1f;加码股市还是追逐房市&#xff1f;都不是。在你分配时间、资源的投资组合里&#xff0c;有没有这一项&#xff1a;“自己”&#xff1f; 没有人会否认充实自我的重要&#xff0c;但是经历一场金融风暴大震撼&#xff0c;当企业…