UCIe协议实战:手把手教你理解PCIe、CXL与Streaming的三种协议选择与协商机制
2026/5/28 2:50:58
Android 底层的SQLiteDatabase并非「开箱即用」的线程安全,核心规则如下:
SQLite 本身的线程模式:
SQLite 有 3 种线程模式,Android 系统默认编译为「多线程模式(MULTITHREADED)」:
SQLiteException: database is locked异常。Android 中使用的核心问题:
SQLiteDatabase实例:系统会通过内置锁保证「单写多读」,但锁竞争可能导致性能下降,甚至极端情况下出现死锁;SQLiteDatabase实例(对应同一个数据库文件):会触发文件级别的锁冲突,大概率出现「database is locked」异常。原生 SQLite 保证线程安全的手动方案:
// 示例:单例 + 同步锁保证 SQLiteDatabase 操作线程安全publicclassDBHelperextendsSQLiteOpenHelper{privatestaticDBHelperinstance;privateSQLiteDatabasedb;// 单例模式,保证全局只有一个 DBHelper 实例publicstaticsynchronizedDBHelpergetInstance(Contextcontext){if(instance==null){instance=newDBHelper(context.getApplicationContext());}returninstance;}// 所有数据库操作通过该方法执行,加同步锁避免多线程冲突publicsynchronizedvoidexecuteUpdate(Stringsql){if(db==null||!db.isOpen()){db=getWritableDatabase();}db.execSQL(sql);}}Room 是 Google 官方推荐的 ORM 框架,基于 SQLite 封装,设计上从根源规避了线程安全问题:
禁止主线程操作:
Room 默认不允许在主线程执行数据库操作(会抛出IllegalStateException),必须通过异步方式执行(协程suspend函数、LiveData、Flow、RxJava),从根本上避免主线程阻塞和线程冲突。
内置线程安全机制:
@Transaction注解,保证一组操作的原子性(要么全部成功,要么全部失败),避免多线程下的数据不一致。Room 线程安全的使用示例:
// 1. DAO 层定义 suspend 函数(协程异步,天然线程安全)@DaointerfaceUserDao{@InsertsuspendfuninsertUser(user:User)// suspend 函数只能在协程/其他 suspend 函数中调用@Transaction// 事务注解,保证操作原子性@Query("UPDATE user SET name = :name WHERE id = :id")suspendfunupdateUserName(id:Int,name:String)}// 2. 调用层(协程中执行,无需手动加锁)viewModelScope.launch(Dispatchers.IO){userDao.insertUser(User(1,"张三"))userDao.updateUserName(1,"李四")}SQLiteDatabase不是开箱即用的线程安全,需通过「单例 + 同步锁」「事务」等手动方式保证,易出错且维护成本高;