android 多线程访问整数问题,请使用AtomicInteger

AtomicInteger时随着jdk5.0出来的,它位于java.util.concurrent.atomic包下,AtomicInteger,一个提供原子操作的Integer的类。也就是说在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口,也就是说当有多个线程操作同一个变量时,使用AtomicInteger不会导致变量出现问题,而且比使用 synchronized效率高,现在就看一个例子:

package cn.kge.com;
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicDemo {
	 public final static AtomicInteger atomicInteger = new AtomicInteger(1);
		public static void main(String[] args) throws InterruptedException {
			 final Thread []threads = new Thread[10];
	         for(int i = 0 ; i < 10 ; i++) {
	             final int num = i;
	             threads[i] = new Thread() {
	                 public void run() {
	                     try {
	                        Thread.sleep(1000);
	                    } catch (InterruptedException e) {
	                        e.printStackTrace();
	                    }
	                    int now = atomicInteger.incrementAndGet();
	                    System.out.println("我是线程:" + num + ",我得到值了,增加后的值为:" + now);
	                 }
	             };
	             threads[i].start();
	         }
	         for(Thread t : threads) {
	             t.join();
	         }
	         System.out.println("最终运行结果:" + atomicInteger.get());
		}
}

运行结果是:

我是线程:1,我得到值了,增加后的值为:2

我是线程:2,我得到值了,增加后的值为:3

我是线程:0,我得到值了,增加后的值为:4

我是线程:9,我得到值了,增加后的值为:5

我是线程:5,我得到值了,增加后的值为:6

我是线程:4,我得到值了,增加后的值为:7

我是线程:8,我得到值了,增加后的值为:8

我是线程:3,我得到值了,增加后的值为:9

我是线程:7,我得到值了,增加后的值为:10

我是线程:6,我得到值了,增加后的值为:11

最终运行结果:11

为什么会是11呢?因为他构造函数中初始化就为1,然后有10个线程,每个线程都加1,就是11了,这就是单个线程执行时,atomicinteger加1不会出现问题,

AtomicInteger使用注意地方就是在你创建AtomicInteger对象时是作为成员变量使用的,不要再局部区域使用此对象!

时间: 2024-10-20 21:14:20

android 多线程访问整数问题,请使用AtomicInteger的相关文章

android Sqlite多线程访问异常解决方案

在开发Android的程序的时候sqlite数据库是经常用到的:在多线程访问数据库的时候会出现这样的异常:java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.或 java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteData

Android 多线程下载,断点续传,线程池

你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效果图是同时开启三个下载任务,限制下载线程数量的效果图. 多线程下载原理 多线程下载的原理就是将下载任务分割成一个个小片段再将每个小片段分配给各个线程进行下载. 例如一个文件大小为100M,我们决定使用4个线程下载,那么每个线程下载的大小即为25M,每个线程的起始以及结束位置依次如下: 0: 0-25M 1: 25-50M 2: 50-75M 3

Android多线程分析之一:使用Thread异步下载图像

罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 打算整理一下对 Android Framework 中多线程相关知识的理解,主要集中在 Framework 层的 Thread, Handler, Looper, MessageQueue, Message, AysncTask,当然不可避免地要涉及到 native 方法,因此也会分析 dalvik 中和线程以及消息处理相关的代码:如 dalvik 中的 C++ Thread 类以及 Message

Android多线程文件下载器

本应用实现的是输入文件的网络的地址,点击按钮开始下载,下载过程中有进度条和后面的文本提示进度, 下载过程中按钮不可点击,防止重复的下载,下载完毕后会进行Toast的提示显示, 并且回复按钮的可点击性,进度条也会清空,当然如果下载中途结束应用进程就会进行进度的保存, 下次下载同样的文件时就会从进度记录进行下载,节省流量和时间 应用需要的应用权限: 访问网络权限 <uses-permission android:name="android.permission.INTERNET"/&

Android多线程编程之Handler篇(消息机制)

Android多线程编程之Handler篇(消息机制) Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑. MessageQueue 消息队列,以队列的形式(实为单链表结构)对外提供插入和删除的工作, Looper 以无限循环的形式不断获取MessageQueue中的消息,有则处理,无则等待. ThreadLocal ThreadLocal可以在不同的线程互不干扰的存储并提供数据,通过ThreadLocal可以很

Andoid 更好的Android多线程下载框架

概述 为什么是更好的Android多线程下载框架呢,原因你懂的,广告法嘛! 本篇我们我们就来聊聊多线程下载框架,先聊聊我们框架的特点: 多线程 多任务 断点续传 支持大文件 可以自定义下载数据库 高度可配置,像超时时间这类 业务数据和下载数据分离 下面我们在说下该框架能实现那些的应用场景: 该框架可以很方便的下载单个文件,并且显示各种状态,包括开始下载,下载中,下载失败,删除等状态. 也可以实现常见的需要下载功能应用,比如:某某手机助手,在该应用内可以说是下载是核心功能,所以对框架的稳定性,代码

Android多线程----异步消息处理机制之Handler详解

关于Android的多线程知识,请参考本人之前的一篇博客:Android 多线程----AsyncTask异步任务详解 在Android当中,提供了异步消息处理机制的两种方式来解决线程之间的通信问题,一种是今天要讲的Handler的机制,还有一种就是之前讲过的 AsyncTask 机制. 一.handler的引入: 我们都知道,Android UI是线程不安全的,如果在子线程中尝试进行UI操作,程序就有可能会崩溃.相信大家在日常的工作当中都会经常遇到这个问题,解决的方案应该也是早已烂熟于心,即创

java多线程以及Android多线程

Java 多线程 线程和进程的区别 线程和进程的本质:由CPU进行调度的并发式执行任务,多个任务被快速轮换执行,使得宏观上具有多个线程或者进程同时执行的效果. 进程:在操作系统来说,一个运行的程序或者说一个动态的指令集合通常对应一个进程Process,它是系统进行资源分配和调度的一个独立单位,也是拥有系统资源的基本单位.进程是系统中独立存在的实体,它可以拥有自己独立的资源,拥有自己私有的地址空间,进程之间不能直接访问其他进程的地址空间. 线程:线程是CPU调度的基本单位,也就是说在一个进程中可以

无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"