使用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 的++不是一个原子操作。
相关推荐
`CircularSet.java`可能实现了这样一个数据结构,其中的添加、移除和检查元素的操作都是原子的,以保证在多线程环境下的正确性。例如,我们可以使用`AtomicReferenceArray`来实现循环集合,通过原子操作来改变索引和...
在多线程环境中,当多个线程同时尝试修改一个`AtomicInteger`实例的值时,`AtomicInteger`会确保这些修改操作是原子性的,即不会被其他线程打断。这通常通过CAS(Compare and Swap)操作来实现,这是一种硬件支持的...
Java多线程编程中,原子性、可见性和有序性是三个关键的概念,它们确保了多线程环境下的正确性。 1. 原子性(Atomicity) 原子性指的是一个操作不可被中断,要么全部执行,要么完全不执行。在Java中,非原生类型的...
java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...
在Java编程语言中,原子类(Atomic Classes)是并发编程中的一个重要工具,它们提供了一种在多线程环境下实现高效、安全的变量操作方式。这些类位于`java.util.concurrent.atomic`包下,能够保证在不使用锁的情况下...
Java线程安全是多线程编程中的一个关键概念,它涉及到...开发者应始终关注线程安全,确保在多线程环境下代码的正确性和稳定性。在实际项目中,可以参考提供的"ThreadSaft"文件中的测试例子,进一步学习和实践这些概念。
- **Atomic类**:提供了一组原子操作,如`AtomicInteger`,在多线程环境下保证了更新操作的原子性。 5. **死锁与活锁** - **死锁**:两个或更多线程相互等待对方释放资源,形成无法解套的循环等待,项目中可能...
5. 原子操作(Atomic):AtomicInteger、AtomicLong等原子类提供了无锁编程的支持,保证了在多线程环境下的原子性操作。 总结,Java多线程设计是构建高性能、高并发应用的基础。通过理解并合理使用不可变对象,我们...
3. `Atomic`类:Java并发包(`java.util.concurrent.atomic`)提供了如`AtomicInteger`、`AtomicLong`等原子类,它们提供了原子操作,如`incrementAndGet()`,在多线程环境下可以替代`synchronized`和`volatile`,实现...
AtomicInteger是Java并发包java.util.concurrent.atomic中的一个类,提供了对单个整型变量进行原子操作的能力,避免了在多线程环境下使用synchronized关键字的复杂性和开销。本文将深入浅出地探讨AtomicInteger的...
例如,`i += 1`操作在多线程环境下并不具备原子性,因为它涉及三个步骤:读取、计算和写回。如果没有适当的同步措施(如synchronized或AtomicInteger),线程切换可能导致结果不一致。 **有序性**: 程序执行的顺序...
原子性操作(如AtomicInteger)则可以保证在多线程环境下的原子性。 6. 线程中断与守护线程 Thread类提供了interrupt()方法用于中断线程,但需要注意的是,这并不意味着线程会立即停止,而是在线程检查到中断标志后...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...
通过学习《Java多线程编程实战指南》,开发者不仅可以理解多线程的基本概念,还能掌握如何在实际项目中运用多线程技术,提升程序的并发性能和稳定性。无论是初级开发者还是经验丰富的工程师,这本书都是一本值得阅读...
原子类如AtomicInteger、AtomicReference等,它们使用CAS操作,能够在不使用锁的情况下实现原子性更新。 高级实用工具类是`java.util.concurrent`的核心,包括线程安全集合(如ConcurrentHashMap、...
多线程编程的核心是保证三个特性:原子性、可见性和有序性。 - **原子性**:确保操作不可分割,要么全做要么不做,避免并发执行时的中断问题。 - **可见性**:线程间对共享变量的修改能立即被其他线程感知。 - **...
而Runnable接口则提供了一种更为灵活的方式,它允许你在不继承Thread的情况下实现多线程,这有利于实现类的多重继承。 创建线程主要有两种方式: 1. 继承Thread类:创建一个新的类,该类继承自Thread类,并重写run...
Java多线程与并发处理是Java编程中的高级话题,涉及到JUC(java.util.concurrent)包中的原子类、CAS(Compare-And-Swap)机制、Unsafe类以及多线程并发的无锁方案和线程安全的实现方法。 CAS是一种无锁的同步机制...
7. 原子操作模式:使用`java.util.concurrent.atomic`包中的原子类,如`AtomicInteger`、`AtomicLong`等,实现非阻塞的原子操作,提升多线程环境下的性能。 8. 轻量级锁定模式:Java 5引入了`java.util.concurrent....
在Java编程中,银行系统是一个典型的多线程应用案例,因为银行系统中涉及多个并发操作,如存款、取款、转账等,这些操作通常需要在不同的线程中并行执行以提高效率。以下是对"java银行系统多线程"这个主题的详细说明...