下面先看乙個例子 :
class執行結果:program
num++;
console.writeline(
"num is:
" +num);
console.writeline(
"main thread id is:
" +thread.currentthread.managedthreadid.tostring());
//停止計時
stopwatch.stop();
//輸出執行的時間,毫秒數
console.writeline("
the execution time is
" + stopwatch.elapsedmilliseconds + "
milliseconds.");
console.readkey();
}public
static
void
run()
}
從上面可以看出變數 num 的值不是連續遞增的,輸出也是沒有順序的,而且每次輸出的值都是不一樣的,這是因為非同步執行緒同時訪問乙個成員時造成的,所以這樣的多執行緒對於我們來說是不可控的。以上這個例子就是非執行緒安全的,那麼要做到執行緒安全就需要用到執行緒同步。執行緒同步有很多種方法,比如之前用到過的 join() 方法,它也可以實現執行緒的同步。下面我們來試試:
class執行結果:program
num++;
console.writeline(
"num is:
" +num);
console.writeline(
"main thread id is:
" +thread.currentthread.managedthreadid.tostring());
//停止計時
stopwatch.stop();
//輸出執行的時間,毫秒數
console.writeline("
the execution time is
" + stopwatch.elapsedmilliseconds + "
milliseconds.");
console.readkey();
}public
static
void
run()
}
這樣就實現了簡單的同步,相比起上面的**也就只是新增了一行**(thread.join();),之前也提到了 join() 這個方法用於阻止當前執行緒,直到前面的執行緒執行完成。可是這樣雖然是實現了同步,但是卻也阻塞了主線程的繼續執行,這樣和單執行緒貌似沒什麼區別了。既然這樣我們再去學習一下其他的方法。
實現執行緒同步還有一種鎖的機制,下面是一種最簡單的鎖機制,即使用 lock。如下:
class執行結果:program
program.num++;
console.writeline(
"num is:
" +program.num);
console.writeline(
"main thread id is:
" +thread.currentthread.managedthreadid.tostring());
//停止計時
stopwatch.stop();
//輸出執行的時間,毫秒數
console.writeline("
the execution time is
" + stopwatch.elapsedmilliseconds + "
milliseconds.");
console.readkey();
}public
void
run()}}
lock 是一種比較好用的簡單的執行緒同步方式,它是通過為給定物件獲取互斥鎖來實現同步的。可以看到這種方式的確沒有阻塞主線程,而且成員變數的值也是連續遞增的,說明是執行緒安全的。lock 鎖機制表示在同一時刻只有乙個執行緒可以鎖定同步物件(在這裡是locker),任何競爭的的其它執行緒都將被阻止,直到這個鎖被釋放。
lock 的引數必須是基於引用型別的物件,不要是基本型別,比如 bool、int,這樣根本不能同步,原因是lock的引數要求是物件,如果傳入 int,勢必要發生裝箱操作,這樣每次lock的都將是乙個新的不同的物件。最好避免使用public型別或不受程式控制的物件例項,因為這樣很可能導致死鎖。永遠也不要 lock 乙個字串。
暫時先到這裡,後面學了其他方法在繼續更新。
第二步 程式語言的學習
xcode的學習和使用非常重要,現在最新穩定版的xcode6是xcode6.4,xcode7按照慣例預計會在今年9月23日的蘋果秋季發布會上,與ios9,swift2.0,ei captain,watch os 2.0還有 的iphone一同發布,xcode6的乙個重要特性是playground,純...
ajax 大洋與小樣的第二步
方法 描述abort 停止當前請求 getallresponseheaders 把 http請求的所有響應首部作為健 值對返回 getresponsehdader header 返回指定首部的串值 open method url 建立對伺服器端呼叫。method引數可以是get post或put。u...
React學習第二步 環境配置與專案搭建
node.js官網 安裝完成開啟cmd命令列,輸入 node v 來檢視版本,若有結果表示安裝成功。由於npm會和node一起安裝,可輸入npm v檢視是否存在。這樣就已經安裝好專案所需環境啦。現在react所需的必要環境已準備完成,下面我們開始使用npm來建立乙個react專案。專案建立完成,大致...