我是新来的Android编程和“之前已经研究不透的Java。我如何使用以确保static variables
线程安全真的很困惑:Java中,正确使用静态变量,以避免死锁 - 同步
我通常会创建一个名为Utils
类有一些static functions
其中最具借我的所有其他类所需要的时间。这是从我的课程中保留重复代码的正确方法。
我总是遇到与使用数据库的问题。当我创建了某些数据库sqliteHelper类,并尝试从说,一个活动和后台服务来管理数据库,我通常会 陷入困境。如果我用的辅助类的局部对象,我要进入数据库的死锁最大时容易出现两个辅助对象试图获取写锁在一起。
为了走出这一困境的,我在utils
类创建辅助类的static
实例。现在对数据库进行任何操作我的行为和我的服务做以下的事情:
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
任何一个可以请解释如何在这种情况下使用。
谢谢
为什么你的insertSomeItemInDatabase没有同步? – njzk2
供参考:您的方法是网络协议中的常用方法。它有点类似于[Aloha协议](http://en.wikipedia.org/wiki/ALOHA_protocol#The_ALOHA_protocol)。如果你想坚持这种方法,你可能想申请[exponantial back off](http://en.wikipedia.org/wiki/Exponential_backoff)。 – amit
我不太了解同步静态变量。一个代码片段和解释将是一个很好的帮助@ njzk2 –