Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java,正确使用静态变量以防止死锁同步_Java_Android_Concurrency_Synchronized_Android Sqlite - Fatal编程技术网

java,正确使用静态变量以防止死锁同步

java,正确使用静态变量以防止死锁同步,java,android,concurrency,synchronized,android-sqlite,Java,Android,Concurrency,Synchronized,Android Sqlite,我是android编程新手,以前没有彻底研究过java。如何使用synchronized来确保静态变量上的线程安全,我真的很困惑: 我通常创建一个名为Utils的类,它有一些静态函数,这些函数大部分时间是我所有其他类所需要的。这是防止重复代码进入我的类的正确方法吗 我总是遇到使用数据库的问题。当我为某个数据库创建sqliteHelper类并尝试从活动和后台服务管理该数据库时,我通常会得到 陷入困境。如果我使用helper类的本地对象,当两个helper对象试图同时获取写锁时,我最容易陷入数据库死

我是android编程新手,以前没有彻底研究过java。如何使用
synchronized
来确保
静态变量上的线程安全,我真的很困惑:

我通常创建一个名为
Utils
的类,它有一些
静态函数
,这些函数大部分时间是我所有其他类所需要的。这是防止重复代码进入我的类的正确方法吗

我总是遇到使用数据库的问题。当我为某个数据库创建sqliteHelper类并尝试从活动和后台服务管理该数据库时,我通常会得到 陷入困境。如果我使用helper类的本地对象,当两个helper对象试图同时获取写锁时,我最容易陷入数据库死锁

为了摆脱这个麻烦,我在
utils
类中创建了helper类的
static
实例。现在,要对数据库my activity和my service执行任何操作,请执行以下操作:

   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


谢谢

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

[1]您在Util中获取的所有变量(用于几乎所有其他类)都可以在此应用程序类中获取。因此,这些变量将可用于所有其他类

[2]创建应用类的Singleton实例。谷歌就可以了

[3]还可以创建DataBaseHelper的单例(如果可能并且可以应用),因此,单实例可以随时随地帮助您


应用程序类是android中的全局类,所以您可以使用它来存储和访问所有全局数据。e、 g:

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;
    }
}
还有一件事。在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"
    ...
    ...
。。。
...

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

[1]您在Util中获取的所有变量(用于几乎所有其他类)都可以在此应用程序类中获取。因此,这些变量将可用于所有其他类

[2]创建应用类的Singleton实例。谷歌就可以了

[3]还可以创建DataBaseHelper的单例(如果可能并且可以应用),因此,单实例可以随时随地帮助您


应用程序类是android中的全局类,所以您可以使用它来存储和访问所有全局数据。e、 g:

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;
    }
}
还有一件事。在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"
    ...
    ...
。。。
...

为什么insertSomeItemInDatabase没有同步?仅供参考:您的方法是网络协议中的常用方法。这有点类似于。如果您想坚持这种方法,您可能需要应用。我对同步静态变量知之甚少。一段代码片段和解释将非常有帮助@njzk2“当两个helper对象试图同时获得写锁时,进入数据库死锁”是什么意思。若你们只有一个锁,就并没有机会出现死锁的情况,你们需要不止一个锁,它并没有任何静态的东西。只需将synchronized放在insertItem方法的声明中。这意味着一次只能有一个线程访问它,其他线程正在排队等待。为什么您的insertSomeItemInDatabase没有同步?仅供参考:您的方法是网络协议中的常用方法。这有点类似于。如果您想坚持这种方法,您可能需要应用。我对同步静态变量知之甚少。一段代码片段和解释将非常有帮助@njzk2“当两个helper对象试图同时获得写锁时,进入数据库死锁”是什么意思。若你们只有一个锁,就并没有机会出现死锁的情况,你们需要不止一个锁,它并没有任何静态的东西。只需将synchronized放在insertItem方法的声明中。这意味着一次只能有一个线程访问它,其他线程正在排队等待。