`
wb284551926
  • 浏览: 556579 次
文章分类
社区版块
存档分类
最新评论

线程安全的AtomicLong使用

阅读更多

看一个计数的类:

[java] view plain copy
 
  1.   
[java] view plain copy
 
  1. public class Counter {  
  2.     private static long counter = 0;  
  3.     public static long addOne(){  
  4.         return ++counter;  
  5.     }  
  6. }  

 

 

初看感觉没啥问题,但这个类在多线程的环境下就会有问题了。

假如开多个线程都来使用这个计数类,它会表现的“不稳定”

 

 

[java] view plain copy
 
  1. public static void main(String[] args) {  
  2.     for(int i=0;i<100;i++){  
  3.         Thread thread = new Thread(){  
  4.             @Override  
  5.             public void run() {  
  6.                 try {  
  7.                     Thread.sleep(100);  
  8.                     if(Counter.addOne() == 100){  
  9.                         System.out.println("counter = 100");  
  10.                     }  
  11.                 } catch (InterruptedException e) {  
  12.                     e.printStackTrace();  
  13.                 }  
  14.             }  
  15.         };  
  16.         thread.start();  
  17.     }  
  18. }  


程序会开100个线程,每个线程都会把counter 加一。那么应该有一个线程拿到counter =100的值,但实际运行情况是大多数据情况下拿不到100,在少数情况能拿到100.

 

因为 Counter 类在 addOne()方法被调用时,并不能保证线程的安全,即它不是原子级别的运行性,而是分多个步骤的,打个比方:

线程1首先取到counter 值,比如为10,然后它准备加1,这时候被线程2占用了cpu,它取到counter为10,然后加了1,得到了11。这时线程1 又拿到了CPU资源,继续它的步骤,加1为11,然后也得到了11。这就有问题了。

那么怎么解决它呢?JDK在concurrent包里提供了一些线程安全的基本数据类型的实现,比如 Long型对应的concurrent包的类是AtomicLong。

现在修改下代码:

 

[java] view plain copy
 
  1. import java.util.concurrent.atomic.AtomicLong;  
  2.   
  3.   
  4. public class Counter {  
  5.     private static AtomicLong counter = new AtomicLong(0);  
  6.   
  7.   
  8.     public static long addOne() {  
  9.         return counter.incrementAndGet();  
  10.     }  
  11. }  



 

运行了多次,结果都是能输出counter = 100。

 

所以在多线程环境下,可以简单使用AtomicXXX 使代码变得线程安全。

转载请注明出处:http://blog.csdn.net/yaqingwa/article/details/17737771

分享到:
评论

相关推荐

    java线程安全测试

    测试线程安全通常包括模拟并发环境,使用多线程进行测试,观察并分析可能产生的错误或不一致。通过编写并运行多线程测试用例,可以发现潜在的线程安全问题,然后针对性地进行修复。 总之,理解Java内存模型和掌握...

    Java常见的线程安全的类.docx

    2. 原子类(Atomicxxx):Java的原子类,如AtomicLong和AtomicInteger,提供了原子操作,它们内部利用Unsafe类的native方法来实现线程安全,无需显式加锁就能保证并发更新的安全性。 3. BlockingQueue和...

    Java多线程与线程安全实践-基于Http协议的断点续传

    可以使用AtomicLong或其他同步机制来实现。 总结起来,Java多线程和线程安全在实现基于HTTP协议的断点续传功能中起着关键作用。理解并掌握这些概念,可以帮助开发者构建高效、可靠的并发应用程序。在实际开发中,要...

    java线程安全总结.pdf

    7. 使用线程安全的集合:java.util.concurrent包中包含了许多线程安全的集合类,例如ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue等,它们可以在多线程环境下安全使用,无需额外的同步。...

    27_多线程_第2天(线程安全、线程同步、等待唤醒机制、单例设计模式)_讲义

    这些方法配合synchronized使用,可以让一个线程在等待条件满足时释放锁并进入等待状态,而其他线程在满足条件后唤醒等待的线程。 **单例设计模式**: 单例模式确保一个类只有一个实例,防止无控制地创建对象。在多...

    java线程安全总结.doc下载

    6. **并发容器**:Java的`java.util.concurrent`包提供了线程安全的容器,如ConcurrentHashMap、CopyOnWriteArrayList等,它们在内部使用了高级同步机制,使得在并发环境下操作容器更加高效和安全。 7. **避免长...

    Java多线程与线程安全实践-基于Http协议的断点续传.rar

    3. **原子操作与Atomic类**:Java提供了AtomicInteger、AtomicLong等原子类,它们的原子操作方法可以避免线程同步,实现高效且线程安全的操作。 三、基于Http协议的断点续传 1. **断点续传原理**:断点续传允许...

    java线程安全总结[汇编].pdf

    线程池的使用可以提高系统的并发性能,并且方便进行线程的调度和管理。 八、死锁、活锁与饥饿 在多线程环境中,可能会遇到死锁(两个或多个线程相互等待对方释放资源)、活锁(线程无限期地等待,但没有进展)和...

    Java多线程与线程安全实践-基于Http协议的断点续传.zip

    - **Atomic类**:如`AtomicInteger`、`AtomicLong`等,提供原子操作,避免线程间的数据竞争。 - **Lock接口与ReentrantLock类**:比`synchronized`更灵活,提供可重入、公平锁等功能。 - **ThreadLocal**:为每个...

    java线程安全总结

    `java.util.concurrent.atomic`包中提供了一系列的原子类,如`AtomicInteger`、`AtomicLong`等,它们提供了线程安全的整型和长整型操作,可以避免使用锁带来的性能开销。 #### 四、Java并发包的应用 Java并发包(`...

    JAVA多线程与线程安全实践-基于Http协议的断点续传.rar

    在Java编程中,多线程和线程安全是核心概念,尤其在开发高效并发应用程序时。本项目"JAVA多线程与线程安全实践-基于Http协议的断点续传"探讨了如何在Java中实现多线程以及如何确保线程安全,特别是在处理HTTP协议的...

    java线程安全性精讲.docx

    Java线程安全性是多线程编程中的核心概念,关乎程序的稳定性和正确性。Java提供了多种机制来确保线程安全,主要包括原子性、可见性和有序性。 **原子性**是线程安全的基础,保证了操作不会被其他线程打断。Java提供...

    基于Http协议的断点续传与Java多线程与线程的安全实践

    3. 使用线程安全的集合类:如ConcurrentHashMap、CopyOnWriteArrayList等,它们在内部实现了线程安全的同步机制。 4. Lock和Condition:Java提供Lock接口和Condition接口,提供了更细粒度的锁控制和线程间通信,...

    java线程使用教程

    `AtomicInteger`、`AtomicLong`等原子类用于实现高效的线程安全的整数操作;`ConcurrentHashMap`、`CopyOnWriteArrayList`等集合类提供线程安全的数据结构。 #### 四、线程在Java UI开发中的应用 - **事件驱动模型...

    计算机毕业设计 Java多线程与线程安全实践-基于Http协议的断点续传 代码论文 范文 模板 资源 JAVA程序源码

    此外,设计和实现这样的系统还需要考虑异常处理、错误恢复、进度保存等功能,以及性能优化,如使用线程池控制并发数,避免过多线程导致系统资源消耗过大。同时,为了提高用户体验,可能还需要添加用户界面,显示下载...

Global site tag (gtag.js) - Google Analytics