tmhouseこと武藤です。
自分ならどうするかなあと思って考えてみたのですが、もしも
DBアクセスの処理が軽いのであれば、すべてmainスレッドで処理
するように工夫するのも手だと思います。
ユーザースレッドからアクセスする必要があるなら駄目ですが。
もしも多数のユーザースレッドからDBアクセスが必要なら、いっそ
Serviceにキューイングする手もあると思います。Serviceが複数起動
するような間違いさえしなければ。
Serviceへ処理をまわす(startServiceでしたか)と、たしか自動的に
キューイングされ順次onStartが呼ばれたような気がするのですが
そこらへんはお調べください。
最後にsingleton化と排他制御ですが、それで原理的には解決
するとは思うものの、様々な面で非常に神経質になるのが嫌です。
本当にsingletonオブジェクトを触っているのか、本当に排他制御
できているのか、デッドロックしないのか、全部神経質な問題です。
それに、もしもこの方法でもまだ問題が再現するとき、結構泣けます。
それでもやむを得ずこの方法を取る場合もあると思います。
以上です。