首页 > 编程知识 正文

用java实现加法,java简单加法器

时间:2023-05-04 08:07:03 阅读:172189 作者:2285

一、什么是Atomic?

Atomic一词与原子有点关系,后者曾被认为是最小物质的单位。 计算机中的Atomic的意思是不能分割成几个部分。 如果某个代码被视为Atomic,则意味着该代码在执行过程中不能中断。 原子指令通常由硬件提供,软件用于实现原子方法。 线程进入方法后,在执行完成之前不会中断。)。

在x86平台上,CPU提供了一种在执行命令时锁定总线的方法。 CPU芯片上有#HLOCK pin的引脚。 在汇编语言程序中,如果在指令前加上前缀' LOCK ',则汇编后的机器代码会使CPU在执行该指令时降低#HLOCK pin的电位,直到该指令结束为止,从而释放并锁定总线。 这样可以防止同一总线上的另一个CPU临时通过总线访问内存,从而保证存在很多此指令

二. JDK1.5的原子包: java.util.concurrent.atomic

这个包里有一群原子。 基本特性是,在多线程环境中,如果多个线程同时执行这些类的实例中包含的方法,则具有排他性。 也就是说,某个线程访问方法,执行其中的指令时,不会被其他线程中断,其他线程就像自旋锁一样,在方法执行完成之前JVM从队列中选择其他线程进行访问,这是因为实际上是通过硬件的相关指令来实现的,不会阻塞线程(synchronized挂起另一个等待的线程) (或者只是在硬件层面上进行了阻塞)。

其中的班级可以分成四个小组

AtomicBoolean、AtomicInteger、AtomicLong和AtomicReference

AtomicIntegerArray,AtomicLongArray

AtomicLongFieldUpdater、AtomicIntegerFieldUpdater、AtomicReferenceFieldUpdater

AtomicMarkableReference,AtomicStampedReference,AtomicReferenceArray

Atomic类角色

将对单一数据的操作原子化了

使用Atomic类生成复杂且不需要阻塞的代码

访问两个或多个atomic变量或对一个atomic变量执行两次或多次操作通常被认为需要进行同步,以便这些操作作为一个原子单位。

2.1 AtomicBoolean、AtomicInteger、AtomicLong和AtomicReference

这四种基本类型用于处理四种类型的数据:布尔、整数、长整数和对象。

构造函数(两个构造函数)

默认构造函数:初始化的数据分别为false、0、0和null

带参数的构造函数:参数已初始化的数据

set (和get )方法:可以按原子方式设置和检索自动数据。 和volatile一样,它保证数据被设置或读取到主存储器中

getAndSet ()方法

原子的将变量设置为新数据,同时返回以前的旧数据

其本质是get () )操作,然后是set ) )操作。 这两个操作都是自动的,但他们在一起时不是自动的。 在Java源程序级别,如果不依赖同步机制,就不可能完成这项工作。 只能依靠native方法。

compareAndSet (和weakCompareAndSet )方法

两种方法都是conditional modifier方法。 这两种方法接受两个参数,一个是期望数据,另一个是新数据。 atomic中的数据与期待数据一致时,将新数据设定为atomic的数据,返回true表示成功; 否则不设定,返回false。

AtomicInteger,AtomicLong还提供了几种特殊的方法。 getAndIncrement ()、incrementAndGet ()、getAndDecrement ()、decrementAndGet ()、addAndGet ()、getAndAdd )实现了几种加法、减法运算第一步,I的读取; 第2步,加或减1。第3步:写回内存)

2.1.1 1示例使用AtomicReference创建线程安全堆栈

Java代码:

1公共类链接堆栈{2}

3 privateatomicreferencestacks=newatomicreference (; 4

5publictpush(te ) {6 NodeoldNode,newNode; 7while(true )//这里的处理很特别,必须是这样。

8 oldNode=stacks.get (; 9newnode=newnode(e,oldNode ); 10if (stacks.compareandset (oldnode,newNode ) ) {11 returne; 十二(十三)十四(十五)

16公共tpop ((17 node oldnode,newNode; 18while(true ) {19 oldNode=stacks.get; 20 newNode=oldNode.next; 21if (stacks.compareandset (oldnode,newNode ) ) {22 returnoldNode.object; 23 }24 }25 }26

27 privatestaticfinalclassnode { 28 private tobject; 29

30私有节点下一步; 31

32privatenode(tobject,Nodenext ) {33 this.object=object; 34 this.next=next; 35 }36 }37 }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。