Java中,正确使用静态变量,以避免死锁 - 同步(java ,Properly using Sta

2019-10-17 06:48发布

我是新来的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在这种情况下。

谢谢

Answer 1:

我认为所有您需要的是创建应用程序类

[1]这是在所有其他类中使用你已经采取了所有的Util这些变量,可以采取在这个应用程序类。 因此,这些变量将提供给所有其他类。

[2]创建机应用类的Singelton实例。 只是谷歌一下吧。

[3]还可以创建DataBaseHelper的辛格尔顿(如果可能的话,可以申请),因此,单个实例可以帮助你的每一个地方。


应用类的是Android全球一流的,所以你可以用它来存储和访问所有全局数据。 例如:

public class AppData extends Application {

    public static AppData appData;

    public int currentUserId; // etc.

    //Const.
    public AppData() {
        appData = this;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        loginPreferences = getSharedPreferences(
            SPF_NAME, 0);

        pathToSDCard = Environment.getExternalStorageDirectory().getAbsolutePath();
        System.out.println("Path : " + pathToSDCard);
       //etc.
    }

 //    MOST IMP  FOR GETTIN SINGELTON INSTANCE     <<<---<<<---<<<---
    public static AppData getAppData() {
        return appData;
    }
}

如何使用它,请参阅本

class ABC extends Activity {
    AppData appData;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.xyz);

        appData = AppData.getAppData();
        ...........
        ...........

        appData.VARIABLE_NAME...
    }
}

一两件事。 在AndroidMenifest.xml

    ...
    ...
<application             //   In Application Tag
        android:name="PACKAGE_NAME.AppData"  //  <<  Add here class name in which you have extended Application
        android:icon="@drawable/ic_launcher"
    ...
    ...


文章来源: java ,Properly using Static variables to prevent deadlock - Synchronizing