編輯:關於Android編程
public class Singleton{
private static Singleton mSingleton;
private Singleton(){
}
public static Singleton getInstance(){
if(mSingleton == null){
mSingleton = new Singleton();\\A
}
return mSingleton;
}
}
上面的做法在多線程的時候會出現問題,比如有兩個線程同時調用getInstance(),這時會new兩個對象出來。
public class Singleton{
private static Singleton mSingleton;
private Singleton(){
}
public static Singleton getInstance(){
synchronized(Singleton.class){
if(mSingleton == null){
mSingleton = new Singleton();\\A
}
return mSingleton;
}
}
}
這種方式還是會有問題,就是高並發情況下多線程去搶奪鎖,假如有幾百個線程,其中有一個運氣比較差,這個線程就會出現一直去getInstance,資源一直返回不回去,UI也不會得到更新。
public class Singleton{
private volatile static Singleton mSingleton;
private Singleton(){
}
public static Singleton getInstance(){
if(mSingleton == null){\\A
synchronized(Singleton.class){\\C
if(mSingleton == null)
mSingleton = new Singleton();\\B
}
}
return mSingleton;
}
}
注:volatile是防止cpu進行指令重排序,防止代碼順序被更改。
這種方式比較好的地方在於第一次創建實例時候就會同步所有的線程,以後再獲取實例就會直接返回。
其實這個意義在於防止多個線程同時進入第一個if內,比如說線程A執行到A行,線程B執行到B行,線程B還沒有返回。當線程A執行到C行,這時線程B初始化實例完畢,如果沒有裡面的再一次判斷就會生成兩個實例!所以兩次的判斷null還是有意義的。
前言當前的網絡開源庫有許多,如volley,okhttp,retrofit等,這三個庫當前是比較火的,其中,okhttp和retrofit由square團隊開發。關於這三
項目中需要用到類似公告欄的控件,能用的基本不支持多行顯示,於是只好自己動手,苦於沒有自定義過一個像樣的控件,借鑒Android公告條demo,實現了多行向上滾動的控件。在
public class EngineerJspActivity extends Activity { private static String Tag = &q
字符串操作JNI把Java字符串當成引用類型來處理,JNI提供了java字符串與C字符串之間相互轉換的必要函數。因為java字符串對象是不可變的,因此JNI不提供任何修改