我是新来的Android编程和“之前已经研究不透的Java。 我如何使用真糊涂synchronized
以确保线程安全static variables
:
我通常会创建一个名为类Utils
其中有一些static functions
这是大部分由我的所有其他类所需要的时间。 这是保持重复的代码了我班的正确途径。
我总是遇到与使用数据库的问题。 当我创建了某些数据库sqliteHelper类,并尝试从说,一个活动和后台服务来管理数据库,我通常会惹上麻烦。 如果我用的辅助类的局部对象,我要进入数据库的死锁最大时容易出现两个辅助对象试图获取写锁在一起。
为了走出这一困境的,我创建了一个static
在我的助手类的实例utils
类。 现在对数据库进行任何操作我的行为和我的服务做以下的事情:
public class Utils{
public static MDatabaseHelper mHelper;
public static void instantiateHelper(Context context){
if(mHelper==null)
mHelper=new MDatabaseHelper(context);
}
}
public class mActivity extends Activity{
public void insert some item in database(final Item item) // this method is called in the Activity at some time
(new Thread(){
@Override public void run(){
Utils.instantiateHelper(getBaseContext());
mHelper.insertItem(item); }
}).start();
}
public class mService extends Service{
public void insert some item in database(final Item item) // this method is called in the service at some time
(new Thread(){
@Override public void run{
Utils.instantiateHelper(getBaseContext());
mHelper.insertItem(item); }
}).start();
}
现在,如果双方在服务和活动什么尝试一起插入项目。 我经常陷入这种状况,发生错误。 为了避免这种情况我使用此解决方法:
我把插入操作在try块,失败我等待随机的时间,然后再试一次
public void insertSomeItemInDatabase(final Item item)
(new Thread(){
@Override public void run(){
int i=0;
Random rand=new Random();
while(true){
if(i>10)
return;
try{
Utils.instantiateHelper(getBaseContext());
mHelper.insertItem(item);
break;
}catch(Exception e){
i++;
try{
Thread.sleep(rand.nextInt(1000));
}catch(Exception e){}
}
}
}
}
}).start();
}
我知道这是同步的最差方法,但因为我很新java
任何一个可以请解释如何使用synchronized
在这种情况下。
谢谢