java对atomicinteger加锁_AtomicInteger解决对整数处理高并发问题【JavaEE+Android】

AtomicInteger是Java 5引入的并发工具类,用于原子性地更新整型变量,解决高并发下的线程安全问题。它通过Unsafe类在内存层面进行读写操作,提供高效且安全的并发性能。此外,AtomicInteger还提供了getAndSet、getAndIncrement等API,适用于多线程环境中的计数器或数据库操作中的锁问题,比如在SQLiteOpenHelper中避免数据库锁错误。
摘要由CSDN通过智能技术生成

给自己一份坚强,擦干眼泪;给自己一份自信,不卑不亢;给自己一份洒脱,悠然前行。轻轻品,静静藏。为了看阳光,我来到这世上;为了与阳光同行,我笑对忧伤。

72dcd259f21c473107b06fc51f310f92.png

AtomicInteger很多开发者,对它还是很陌生的,那么AtomicInteger是什么呢?可用来干什么呢?

一、AtomicInteger简介

AtomicInteger出自jdk5.0,它继承Number,实现对整形数据的处理。

class AtomicInteger extends Number implements java.io.Serializable

/**

* An {@codeint} value that may be updated atomically. See the

* {@linkjava.util.concurrent.atomic} package specification for

* description of the properties of atomic variables. An

* {@codeAtomicInteger} is used in applications such as atomically

* incremented counters, and cannot be used as a replacement for an

* {@linkjava.lang.Integer}. However, this class does extend

* {@codeNumber} to allow uniform access by tools and utilities that

* deal with numerically-based classes.

*

*@since1.5

*@authorDoug Lea

*/

二、AtomicInteger理解

为什么官方会提供这么一个类,来处理整形数据呢?对整形的处理,本身并不是很难,但是在一些特殊的环境下,对整形的处理可能不仅仅是简单的处理就能规避一个错误的发生。

例如:程序中有一个变量i,通过线程执行i++操作,线程执行完后跳转到主线程进行操作,这是编程过程中经常使用的一种情况,但是如果是在一组线程都对变量i进行操作,那么该组各个线程都将会对i进行操作,这样最终跳转到主线程中变量i的值可能会不确定。原因是当i要在主线程中执行时候,可能某个子线程刚好要修改i的值,这样就会出现i的值混乱,这时候我们可能需要使用synchronized(同步)关键字进行处理。

那么AtomicInteger为什么可以解决多线程安全问题呢?

查看Java源码可以知道,AtomicInteger实际上是借助sun.misc.Unsafe U = sun.misc.Unsafe.getUnsafe()来实现对整形数据的操作。Unsafe类可以用来在任意内存地址位置处读写数据。可以简单的理解AtomicInteger可以对内存进行读写操作,所以无论是从效率上,还是从安全性上AtomicInteger都会更胜一筹。

三、AtomicInteger常用API

// 获取当前的值

public final int get();

// 取当前的值,并设置新的值

public final int getAndSet(int newValue);

// 获取当前的值,并自增

public final int getAndIncrement();

// 获取当前的值,并自减

public final int getAndDecrement();

// 获取当前的值,并加上预期的值

public final int getAndAdd(int delta);

四、AtomicInteger使用场景

除了上面举例所说多线程对整形变量处理操作可以应用到。其实AtomicInteger还可以用于很多地方,例如利用AtomicInteger规避数据库锁的问题。

例如:在进行数据库(SQLite)操作的时候,每一次对数据库读写都会进行一次数据库的打开和关闭的过程,如果频繁的对数据库进行读写,可能会出现一种情况,就是当对数据库读写的时候,数据库已经关闭了,这个时候就会报出数据库锁的错误,如何解决这一问题?可以通过AtomicInteger。

SQLiteOpenHelper为android.database.sqlite包下一个专门操作SQLite的帮助抽象类。

class SQLiteHelper extends SQLiteOpenHelper {

private AtomicIntegerm OpenCounter=new AtomicInteger(0);

private SQLiteDatabase mDatabase;

private static SQLiteHelper SQLiteHelper;

/**

*获取MySqliteHelper,单列模式

*

*@paramcontext上下文对象

*@return

*/

static synchronized SQLiteHelper getSqliteHelper(Context context) {

if(SQLiteHelper==null)

SQLiteHelper=new SQLiteHelper(context);

return SQLiteHelper;

}

/**

*打开数据库

*/

synchronized SQLiteDatabase openDatabase() {

if(mOpenCounter.incrementAndGet() ==1) {

mDatabase=SQLiteHelper.getWritableDatabase();

}

return mDatabase;

}

/**

*关闭数据库

*/

synchronized void closeDatabase() {

if(mOpenCounter.decrementAndGet() ==0) {

mDatabase.close();

}

}

/**

*构造函数

*

*@paramcontext上下文对象

*@paramname创建数据库的名称

*@paramfactory游标工厂

*@paramversion创建数据库版本>= 1

*/

public SQLiteHelper(Context context,String name,SQLiteDatabase.CursorFactory factory, intversion) {

super(context,name,factory,version);

}

private SQLiteHelper(Context context) {

// 创建数据库

super(context,SQLiteConstant.DB_NAME, null,SQLiteConstant.DB_VERSION);

}

/**

*当数据库创建时回调的函数

*

*@paramdb数据库对象

*/

@Override

public void onCreate(SQLiteDatabase db) {

//创建数据表

db.execSQL(SQLiteConstant.SQL_CREATE_TABLE_USER);

}

/**

*当数据库版本更新的时候回调函数

*

*@paramdb数据库对象

*@paramoldVersion数据库旧版本

*@paramnewVersion数据库新版本

*/

@Override

public voidonUpgrade(SQLiteDatabase db, intoldVersion, intnewVersion) {

//升级数据库

db.execSQL(SQLiteConstant.SQL_DROP_TABLE_USER);

db.execSQL(SQLiteConstant.SQL_CREATE_TABLE_USER);

}

}

微信公众号:书客创作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值