美文网首页软件测试学习之路我爱编程Java理论知识集
多线程并发解决方案(原子变量的使用)

多线程并发解决方案(原子变量的使用)

作者: 乘风破浪的姐姐 | 来源:发表于2018-04-15 17:41 被阅读20次

下面是一个没有控制并发的计数器:

public class Counter implements Runnable {  
private static int count;  
    
public void run() {  
    System.out.println(Thread.currentThread().getName() + ":" + (++count));  
    }  
          
public static void main(String[] args){  
    Counter counter = new Counter();  
    Thread t1 = new Thread(counter);  
    Thread t2 = new Thread(counter);  
        Thread t3 = new Thread(counter);  
    Thread t4 = new Thread(counter);  
    t1.start();  
    t2.start();  
    t3.start();  
    t4.start();  
    }  
}  

每次执行输出的结果不一样,如:

    Thread-1:2  
    Thread-0:1  
    Thread-2:3  
    Thread-3:3  

从Java内存模型的角度来看,简单的counter++的执行过程其实分为如下三步:
第一步,从主内存中加载counter的值到线程工作内存
第二步,执行加1运算
第三步,把第二步的执行结果从工作内存写入到主内存

为了预防并发情况的产生,可以使用原子变量java.util.concurrent.atomic包下的类

    public class Counter implements Runnable {  
        private final AtomicInteger count = new AtomicInteger(0);  
          
        public void run() {  
            System.out.println(Thread.currentThread().getName()   
                    + ":" + count.incrementAndGet());  
        }  
          
        public static void main(String[] args){  
            Counter counter = new Counter();  
            Thread t1 = new Thread(counter);  
            Thread t2 = new Thread(counter);  
            Thread t3 = new Thread(counter);  
            Thread t4 = new Thread(counter);  
            t1.start();  
            t2.start();  
            t3.start();  
            t4.start();  
        }  
    }  

其中自增自减方法说明:
incrementAndGet(),返回新值(即加1后的值)
getAndIncrement(),返回旧值(即加1前的原始值)

decrementAndGet(),返回新值(即减1后的值)
getAndDecrement(),返回旧值(即减1前的原始值)

相关文章

  • 多线程并发解决方案(原子变量的使用)

    下面是一个没有控制并发的计数器: 每次执行输出的结果不一样,如: 从Java内存模型的角度来看,简单的counte...

  • 多线程并发解决方案(原子变量的使用)

    下面是一个没有控制并发的计数器: 每次执行输出的结果不一样,如: 从Java内存模型的角度来看,简单的counte...

  • java lock

    多线程访问同一个变量,不进行同步,会造成结果不一致。这里解决方案有很多,使用原子变量。加锁同步,使用synchro...

  • 05.并发编程之单例和多线程

    1、ThreadLocal 线程局部变量,是一种多线程间并发访问变量的解决方案,与synchronized加锁方式...

  • Atomic 原子操作类介绍

    Atomic 原子操作类介绍 在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是多线程更新变量 i=1,...

  • volatile关键字

    1、概述 volatile保证多线程下变量可见性和有序性的问题,不保证原子性。 volatile不是并发安全的,因...

  • JAVA 多线程与高并发学习笔记(九)——JUC原子类

    在多线程并发中,诸如“++”或“--”元素不具备原子性,不是线程安全的,需要使用JDK中的JUC原子类 Atomi...

  • 原子操作类

    原子操作类简介 在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是多线程更新变量i=1,比如多个线程执行...

  • 2.安全性

    java中多线程同步包括: synchronized 显示锁 volatile 原子变量 之所以要使用同步,是因为...

  • Java并发之原子变量及CAS算法-下篇

    Java并发之原子变量及CAS算法-下篇 概述 本文主要讲在Java并发编程的时候,如果保证变量的原子性,在JDK...

网友评论

本文标题:多线程并发解决方案(原子变量的使用)

本文链接:https://www.haomeiwen.com/subject/dwtjkftx.html