Будет ли создание класса SQLiteOpenHelper синглэном сделать его безопасным?

Я создаю службу, в которой есть три потока:

  • Трекер местоположения GPS, который будет записывать значения местоположения в базу данных.
  • Отправитель, который читает и записывает в базу данных.
  • Поток получателя, который также читает и записывает в базу данных.

Теперь я видел сообщения вроде этих, в которых говорится, что должен быть доступен только один класс-помощник, а также только соединение с БД. Я попытался реализовать только один экземпляр класса Helper с использованием шаблона Singleton, но я совершенно смущен тем, как создавать только одно соединение с БД, которое может выполнить три задачи, о которых я упоминал ранее. Здесь моя реализация класса Helper.

package com.example.userpc.roadtracker;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
  * Created by USER PC on 5/21/2016.
*/
public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME="location_service.db";
    private static final int VERSION=1;
    private static final String DB_CREATE="CREATE TABLE `location_service`.`location` ( `id` INT NOT NULL AUTO_INCREMENT , `longitude` DOUBLE NOT NULL , `latitude` DOUBLE NOT NULL , PRIMARY KEY (`id`), UNIQUE (`longitude`, `latitude`)) ENGINE = MyISAM;";

    private static SQLiteDatabase mDatabase=null;
    private static DatabaseHelper mDatabaseHelper=null;

    private DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, VERSION);
    }

    public static DatabaseHelper getInstance(Context context)
    {
        if(mDatabaseHelper==null)
             return new DatabaseHelper(context);
        else
             return mDatabaseHelper;
    }

    public SQLiteDatabase getUsableDataBase()
    {
        if(mDatabase==null)
            return this.getWritableDatabase();
        else
            return mDatabase;
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL(DB_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

Спасибо заранее.

Ответ 1

Нет, вам все равно нужно синхронизировать блоки вашего кода, в котором вы обращаетесь к экземпляру SQLiteOpenHelper.

Это будет один экземпляр с Singleton, но это не означает, что 2 потока не смогут получить доступ к одному экземпляру.