单例模式属于对象创建型模式,其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。对一些类来说,只有一个实例是很重要的,比如最近我的一个Android项目中用到一个数据库管理类来封装SQLite读写操作。我们知道,SQLite对多线程支持并不是很好,如果两个线程同时操作数据库,会报 "Database is locked" 的错误。我想到的解决办法有两个:一是运用同步机制,比如在一个线程类中对数据库操作的部分加入 synchronized 关键字,这样就可以确保该线程类的多个实例操作数据库时不会发生冲突,但是如果两个不同的线程类的实例在同一时刻操作数据库时,用 synchronized 关键字就不处理不了了。发现 SQLiteDatabase 类中有一个 isDbLockedByOtherThreads() 方法,用来判断一个数据库对象是否被其他线程锁定。由于我每次操作数据库,都new一个SQLiteOpenHelper的实例,所以用 isDbLockedByOtherThreads() 方法的结果总是false。所以想到了第二种解决办法,也就是在数据库管理类中运用单例模式,这样就保证了无论在哪个线程中获取数据库对象,都是同一个对象,那么就可在一个线程中用 isDbLockedByOtherThreads() 方法判断数据库是否被其他线程锁定,如果是,则sleep等待,直至锁被释放。
以下Classroomdb 类正是运用了单例模式:
public class Classroomdb extends SQLiteOpenHelper { private static final String DATABASE_NAME = "classroom.db"; private static final int DATABASE_VERSION = 1; private static final String TABLE_NAME ="classroom_info"; private static Classroomdb instance; private Classroomdb(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } public static Classroomdb Instance(Context context) { if (instance == null) { instance = new Classroomdb(context); } return instance; } @Override//创建表 public void onCreate(SQLiteDatabase db) { String sql = "CREATE TABLE " + TABLE_NAME + " (classroom_num, building, morning1, morning2, afternoon1, afternoon2, night1);"; Log.i("createDB=", sql); db.execSQL(sql); // db.close(); } @Override public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { // TODO Auto-generated method stub } /* * 操作一 */ public void update(String[] classroom_num, String[] morning1, String[] morning2, String[] afternoon1, String[] afternoon2, String[] night1){ // ...... } /* * 操作二 */ public String[] readData(String time, String build) { // ...... } /* * 操作三 */ public String[] getSingleClassroom(String roomNum) { // ...... } }
在线程中就可如下来处理:
Classroomdb db = Classroomdb.Instance(context); while (db.getWritableDatabase().isDbLockedByOtherThreads()) { Log.w("dblock", "db is locked by other threads!"); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } }
相关推荐
简单的单例模式举例Singleton 分为恶汉式 懒汉式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个...
单例模式的特点有三: 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 Singleton模式包含的角色只有一个,就是Singleton。Singleton拥有一个私有构造函数,...
设计模式C++学习之单例模式(Singleton)
java Singleton单例模式 java Singleton单例模式
此示例展示了Qml 的单例模式(类似全局对象,只生成一次实例,可全局使用) surfsky.cnblogs.com
一个产生随机数的例子,整个应用程序中只需要一个类的实例来产生随机数,客户端程序从类中获取这个实例,调用这个实例的方法nextInt(),公用的方法访问需要进行同步,这是单例模式需要解决的同步问题。
单例模式 Singleton 单例模式线程安全问题和拓展
单例模式(Singleton)
Singleton pattern单例模式应用
在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样有几个好处: 1、某些类创建比较频繁,对于一些大型的对象,这可以节省一笔很大的系统开销。 2、省去了new操作符,降低了系统内存的使用频率...
单例模式(Singleton)的6种实现
该文当中对Java单类模式有非常细致入微的,循序渐进的讲解。
设计模式总结-模板设计模式,单例模式(singleTon)
Java面向对象(高级)-- 单例(Singleton)设计模式
深入浅出Singleton,详细掌握单例模式
4、单例模式(Singleton Pattern) 用意:仅允许生成一个对象时
四种常见的单例: 1、没有构造函数(DEFINE_SINGLETON_DEFAULT); 2、有构造函数,构造函数没有参数(DEFINE_SINGLETON_CONSTRUCT_NO_PARAM); 3、有构造函数,构造函数有没有参数版本(DEFINE_SINGLETON_...
单例设计模式Singleton1