1.使用Runnable接口可以輕松實作多個線程共享相同資料,隻要用用一個可運作對象作為參數
建立多個線程就可以了
2.當一個線程對共享的資料進行操作時,應使之成為一個“原子操作”即在沒有完成相關操作
之前,不允許其他線程打斷他,否則就會破壞資料的完整性,必然會得到錯誤的處理結果
這就是線程的同步
3.被多個線程共享的資料在同一時刻隻允許一個線程處于操作之中,這就是同步控制中的
“線程間互斥”問題
4.同步指的是處理資料的線程不能處理其他線程目前還沒有處理結束的資料,
但可以處理其他的資料
5.在并發程式設計中,對多線程共享的資源或資料稱為臨界資源或同步資源
6.JAVA語言使用synchronize關鍵字來辨別同步的資源,這裡的資源可以是一種類型的資料,
也可以是對象,也可以是一種方法,還可以是一段代碼。synchronized直譯為同步,但實際
指的是互斥。
7.synchronized的用法如下:
格式一:同步語句
Sychronize(對象){
臨界代碼段}
其中,“對象”是多線程共同操作的公共變量。即需要鎖定的臨界資源,它将被互斥的使用
格式二:互斥方法
public synchronize 傳回類型 方法名(){
方法體}
同步方法的等效方式如下:
public 傳回類型 方法名(){
synchronized(this)
{
方法體}}
8.synchronize的功能是:首先判斷對象或方法的互斥鎖是否存在,若在就獲得互斥鎖,然後
可以執行緊随其後的臨界代碼段或方法體;如果對象或方法的互斥鎖不在(已被其他線程拿走)
直到獲得互斥鎖
9.這些線程的synchronize代碼塊之間是串行執行的,不再是互相交替穿插并發執行的
10.synchronize代碼塊中的代碼數量越少越好,包含的範圍越小越好,否則就會失去多線程
并發執行的好多優勢
11.若兩個或多個線程鎖定的不是同一個對象,則它們的synchronize代碼塊可以互相交替穿插
并執行
12.所有的非synchronize代碼塊或方法,都可自由調用。如線程A獲得了對象的互斥鎖,調用
對象的synchronize代碼塊,其他線程依然可以自有調用該對象的所有非synchronize方法或
代碼
13.任何時刻一個代碼的互斥鎖隻能被一個線程所擁有
14.隻有當一個線程執行完它所調用對象的所有synchronize代碼塊或方法時,該線程會釋放
這個對象的互斥鎖
15.臨界代碼中的共享變量應定義為private型。否則,其他類的方法可能直接通路和操作該
共享變量,這樣synchronize的保護就失去了意義
16.隻能用臨界代碼段中的方法通路共享變量。故鎖定的對象通常識this,即通用格式是:
synchronize(this){...}
17.一定要保證,所有對臨界代碼中共享變量的通路與操作均在synchronize代碼塊中執行
18.對于一個static型的方法,即類方法,那麼整個方法時synchronize,要麼整個方法不是
synchronized
19.如果synchronize用在類聲明中,則表示類中的所有方法都是synchronize的
20.線程之間的通信
注意:對于一個線程,若基于對象x調用了wait()、notify()方法、notifyAll()方法,
該線程必須已經獲得對象x的互斥鎖。換句話說,wait()、notify()、notifyAll()隻能在同步
代碼塊裡調用
總結:今天學習了同步以及并發的執行,對同步之間控制的關鍵字synchronize有了深刻的了解