記錄一下手上專案編寫過程遇到的坑
阿新 • • 發佈:2019-01-06
一、全域性變數多執行緒訪問遇到的坑。
定義了一個全域性變數,第一個子執行緒一直判斷這個變數是否滿足條件,第二個執行緒用來改變這個變數的值。
int isRun=20; private void threadOne(){ new Thread(){ public void run() { for (int i = 0; i < 1;) { if (isRun!=20) { break; } } }; }.start(); } private void threadTwo(){ new Thread(){ public void run() { isRun=30; }; }.start(); }
在某些手機上,isRun引數發生改變後 ,threadOne()方法裡面的isRun不一定會及時更新。問了幾個大神,原來執行緒會建立變數副本,所以全域性變數isRun發生了改變,threadOne()方法裡面的值沒有和全域性變數isRun同步。
解決辦法:
1、把變數isRun封裝成物件。測試發現可行
2、在判斷之前加點延時,
try {
Thread.sleep(2);
} catch (InterruptedException e) {
}
if (isRun!=20) {
break;
}
測試結果:可行。但是不知道應該設定多少延時為好。