`

AtomicInteger在多线程下的原子性测试

阅读更多

 

使用AtomicInteger做计数器的一个例子:

package test.caipiao.log;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.ArrayList;
import java.util.Iterator;

public class CounterTest {

    public static void main(String[] args) throws InterruptedException {

        final Counter counter = new Counter();

        // create 1000 threads
        ArrayList<MyThread> threads = new ArrayList<MyThread>();
        for (int x = 0; x < 1000; x++) {
            threads.add(new MyThread(counter));
        }

        // start all of the threads
        Iterator i1 = threads.iterator();
        while (i1.hasNext()) {
            MyThread mt = (MyThread) i1.next();
            mt.start();
        }

        // wait for all the threads to finish
        Iterator i2 = threads.iterator();
        while (i2.hasNext()) {
            MyThread mt = (MyThread) i2.next();
            mt.join();
        }

        System.out.println("Count: " + counter.getCount());
    }
}

// thread that increments the counter 100000 times.
class MyThread extends Thread {
    Counter counter;

    MyThread(Counter counter) {
        this.counter = counter;
    }

    public void run() {
        for (int x = 0; x < 100000; x++) {
            counter.incrementCount();
        }
    }
}

// class that uses AtomicInteger for counter
class Counter {

    private AtomicInteger count = new AtomicInteger(0);

    public void incrementCount() {
        count.incrementAndGet();
    }

    public int getCount() {
        return count.get();
    }
}

 

输出如下:

Count: 100000000

 

使用int做计数器的一个例子:

package test.caipiao.log;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.ArrayList;
import java.util.Iterator;

public class CounterTest2 {

    public static void main(String[] args) throws InterruptedException {

        final Counter2 counter = new Counter2();

        // create 1000 threads
        ArrayList<MyThread2> threads = new ArrayList<MyThread2>();
        for (int x = 0; x < 1000; x++) {
            threads.add(new MyThread2(counter));
        }

        // start all of the threads
        Iterator i1 = threads.iterator();
        while (i1.hasNext()) {
            MyThread2 mt = (MyThread2) i1.next();
            mt.start();
        }

        // wait for all the threads to finish
        Iterator i2 = threads.iterator();
        while (i2.hasNext()) {
            MyThread2 mt = (MyThread2) i2.next();
            mt.join();
        }

        System.out.println("Count: " + counter.getCount());
    }
}

// thread that increments the counter 100000 times.
class MyThread2 extends Thread {
    Counter2 counter;

    MyThread2(Counter2 counter) {
        this.counter = counter;
    }

    public void run() {
        for (int x = 0; x < 100000; x++) {
            counter.incrementCount();
        }
    }
}

// class that uses AtomicInteger for counter
class Counter2 {

    private int count = 0;

    public void incrementCount() {
        count ++;
    }

    public int getCount() {
        return count;
    }
}

 

输出如下:

Count: 43034849

 

可以看到AtomicInteger例子输出结果是正确的,AtomicInteger 的incrementAndGet()是一个原子操作;

而int例子的输出结果是不正确的,int 的++不是一个原子操作。

 

 

 

 

分享到:
评论

相关推荐

    java多线程中的原子操作

    `CircularSet.java`可能实现了这样一个数据结构,其中的添加、移除和检查元素的操作都是原子的,以保证在多线程环境下的正确性。例如,我们可以使用`AtomicReferenceArray`来实现循环集合,通过原子操作来改变索引和...

    Java中对AtomicInteger和int值在多线程下递增操作的测试

    在多线程环境中,当多个线程同时尝试修改一个`AtomicInteger`实例的值时,`AtomicInteger`会确保这些修改操作是原子性的,即不会被其他线程打断。这通常通过CAS(Compare and Swap)操作来实现,这是一种硬件支持的...

    Java多线程中提到的原子性和可见性、有序性1

    Java多线程编程中,原子性、可见性和有序性是三个关键的概念,它们确保了多线程环境下的正确性。 1. 原子性(Atomicity) 原子性指的是一个操作不可被中断,要么全部执行,要么完全不执行。在Java中,非原生类型的...

    多线程demo/java多线程练习

    - **Atomic类**:提供了一组原子操作,如`AtomicInteger`,在多线程环境下保证了更新操作的原子性。 5. **死锁与活锁** - **死锁**:两个或更多线程相互等待对方释放资源,形成无法解套的循环等待,项目中可能...

    java多线程安全性基础介绍.pptx

    java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...

    原子类测试

    在Java编程语言中,原子类(Atomic Classes)是并发编程中的一个重要工具,它们提供了一种在多线程环境下实现高效、安全的变量操作方式。这些类位于`java.util.concurrent.atomic`包下,能够保证在不使用锁的情况下...

    java线程安全测试

    Java线程安全是多线程编程中的一个关键概念,它涉及到...开发者应始终关注线程安全,确保在多线程环境下代码的正确性和稳定性。在实际项目中,可以参考提供的"ThreadSaft"文件中的测试例子,进一步学习和实践这些概念。

    java多线程设计

    5. 原子操作(Atomic):AtomicInteger、AtomicLong等原子类提供了无锁编程的支持,保证了在多线程环境下的原子性操作。 总结,Java多线程设计是构建高性能、高并发应用的基础。通过理解并合理使用不可变对象,我们...

    java多线程_java多线程下变量共享_

    3. `Atomic`类:Java并发包(`java.util.concurrent.atomic`)提供了如`AtomicInteger`、`AtomicLong`等原子类,它们提供了原子操作,如`incrementAndGet()`,在多线程环境下可以替代`synchronized`和`volatile`,实现...

    AtomicInteger 浅谈

    AtomicInteger是Java并发包java.util.concurrent.atomic中的一个类,提供了对单个整型变量进行原子操作的能力,避免了在多线程环境下使用synchronized关键字的复杂性和开销。本文将深入浅出地探讨AtomicInteger的...

    java并发理论基础、可见性、原子性、有序性详解

    例如,`i += 1`操作在多线程环境下并不具备原子性,因为它涉及三个步骤:读取、计算和写回。如果没有适当的同步措施(如synchronized或AtomicInteger),线程切换可能导致结果不一致。 **有序性**: 程序执行的顺序...

    Java多线程详解及示例

    原子性操作(如AtomicInteger)则可以保证在多线程环境下的原子性。 6. 线程中断与守护线程 Thread类提供了interrupt()方法用于中断线程,但需要注意的是,这并不意味着线程会立即停止,而是在线程检查到中断标志后...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    通过学习《Java多线程编程实战指南》,开发者不仅可以理解多线程的基本概念,还能掌握如何在实际项目中运用多线程技术,提升程序的并发性能和稳定性。无论是初级开发者还是经验丰富的工程师,这本书都是一本值得阅读...

    java 多线程同步

    原子类如AtomicInteger、AtomicReference等,它们使用CAS操作,能够在不使用锁的情况下实现原子性更新。 高级实用工具类是`java.util.concurrent`的核心,包括线程安全集合(如ConcurrentHashMap、...

    多线程-day02.docx

    多线程编程的核心是保证三个特性:原子性、可见性和有序性。 - **原子性**:确保操作不可分割,要么全做要么不做,避免并发执行时的中断问题。 - **可见性**:线程间对共享变量的修改能立即被其他线程感知。 - **...

    java多线程编程

    而Runnable接口则提供了一种更为灵活的方式,它允许你在不继承Thread的情况下实现多线程,这有利于实现类的多重继承。 创建线程主要有两种方式: 1. 继承Thread类:创建一个新的类,该类继承自Thread类,并重写run...

    Java 多线程与并发(8-26)-JUC原子类- CAS, Unsafe和原子类详解.pdf

    Java多线程与并发处理是Java编程中的高级话题,涉及到JUC(java.util.concurrent)包中的原子类、CAS(Compare-And-Swap)机制、Unsafe类以及多线程并发的无锁方案和线程安全的实现方法。 CAS是一种无锁的同步机制...

    Java多线程设计模式(带源码)

    7. 原子操作模式:使用`java.util.concurrent.atomic`包中的原子类,如`AtomicInteger`、`AtomicLong`等,实现非阻塞的原子操作,提升多线程环境下的性能。 8. 轻量级锁定模式:Java 5引入了`java.util.concurrent....

    java 银行系统多线程

    在Java编程中,银行系统是一个典型的多线程应用案例,因为银行系统中涉及多个并发操作,如存款、取款、转账等,这些操作通常需要在不同的线程中并行执行以提高效率。以下是对"java银行系统多线程"这个主题的详细说明...

Global site tag (gtag.js) - Google Analytics