看一个计数的类:
- public class Counter {
- private static long counter = 0;
- public static long addOne(){
- return ++counter;
- }
- }
初看感觉没啥问题,但这个类在多线程的环境下就会有问题了。
假如开多个线程都来使用这个计数类,它会表现的“不稳定”
- public static void main(String[] args) {
- for(int i=0;i<100;i++){
- Thread thread = new Thread(){
- @Override
- public void run() {
- try {
- Thread.sleep(100);
- if(Counter.addOne() == 100){
- System.out.println("counter = 100");
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- };
- thread.start();
- }
- }
程序会开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。
现在修改下代码:
- import java.util.concurrent.atomic.AtomicLong;
- public class Counter {
- private static AtomicLong counter = new AtomicLong(0);
- public static long addOne() {
- return counter.incrementAndGet();
- }
- }
运行了多次,结果都是能输出counter = 100。
所以在多线程环境下,可以简单使用AtomicXXX 使代码变得线程安全。
转载请注明出处:http://blog.csdn.net/yaqingwa/article/details/17737771
相关推荐
测试线程安全通常包括模拟并发环境,使用多线程进行测试,观察并分析可能产生的错误或不一致。通过编写并运行多线程测试用例,可以发现潜在的线程安全问题,然后针对性地进行修复。 总之,理解Java内存模型和掌握...
2. 原子类(Atomicxxx):Java的原子类,如AtomicLong和AtomicInteger,提供了原子操作,它们内部利用Unsafe类的native方法来实现线程安全,无需显式加锁就能保证并发更新的安全性。 3. BlockingQueue和...
可以使用AtomicLong或其他同步机制来实现。 总结起来,Java多线程和线程安全在实现基于HTTP协议的断点续传功能中起着关键作用。理解并掌握这些概念,可以帮助开发者构建高效、可靠的并发应用程序。在实际开发中,要...
7. 使用线程安全的集合:java.util.concurrent包中包含了许多线程安全的集合类,例如ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue等,它们可以在多线程环境下安全使用,无需额外的同步。...
这些方法配合synchronized使用,可以让一个线程在等待条件满足时释放锁并进入等待状态,而其他线程在满足条件后唤醒等待的线程。 **单例设计模式**: 单例模式确保一个类只有一个实例,防止无控制地创建对象。在多...
6. **并发容器**:Java的`java.util.concurrent`包提供了线程安全的容器,如ConcurrentHashMap、CopyOnWriteArrayList等,它们在内部使用了高级同步机制,使得在并发环境下操作容器更加高效和安全。 7. **避免长...
3. **原子操作与Atomic类**:Java提供了AtomicInteger、AtomicLong等原子类,它们的原子操作方法可以避免线程同步,实现高效且线程安全的操作。 三、基于Http协议的断点续传 1. **断点续传原理**:断点续传允许...
线程池的使用可以提高系统的并发性能,并且方便进行线程的调度和管理。 八、死锁、活锁与饥饿 在多线程环境中,可能会遇到死锁(两个或多个线程相互等待对方释放资源)、活锁(线程无限期地等待,但没有进展)和...
- **Atomic类**:如`AtomicInteger`、`AtomicLong`等,提供原子操作,避免线程间的数据竞争。 - **Lock接口与ReentrantLock类**:比`synchronized`更灵活,提供可重入、公平锁等功能。 - **ThreadLocal**:为每个...
`java.util.concurrent.atomic`包中提供了一系列的原子类,如`AtomicInteger`、`AtomicLong`等,它们提供了线程安全的整型和长整型操作,可以避免使用锁带来的性能开销。 #### 四、Java并发包的应用 Java并发包(`...
在Java编程中,多线程和线程安全是核心概念,尤其在开发高效并发应用程序时。本项目"JAVA多线程与线程安全实践-基于Http协议的断点续传"探讨了如何在Java中实现多线程以及如何确保线程安全,特别是在处理HTTP协议的...
Java线程安全性是多线程编程中的核心概念,关乎程序的稳定性和正确性。Java提供了多种机制来确保线程安全,主要包括原子性、可见性和有序性。 **原子性**是线程安全的基础,保证了操作不会被其他线程打断。Java提供...
3. 使用线程安全的集合类:如ConcurrentHashMap、CopyOnWriteArrayList等,它们在内部实现了线程安全的同步机制。 4. Lock和Condition:Java提供Lock接口和Condition接口,提供了更细粒度的锁控制和线程间通信,...
`AtomicInteger`、`AtomicLong`等原子类用于实现高效的线程安全的整数操作;`ConcurrentHashMap`、`CopyOnWriteArrayList`等集合类提供线程安全的数据结构。 #### 四、线程在Java UI开发中的应用 - **事件驱动模型...
此外,设计和实现这样的系统还需要考虑异常处理、错误恢复、进度保存等功能,以及性能优化,如使用线程池控制并发数,避免过多线程导致系统资源消耗过大。同时,为了提高用户体验,可能还需要添加用户界面,显示下载...