JAVA線程4 多線程同步

同步與異步?

同步:在多線程中經常會碰到數據的共享問題,即當多個線程訪問同一個資源時,需要以某種順序來確保該資源在某一時刻只能被一個線程使用。

要想實現同步操作,必須要獲得每一個線程對象的鎖。保證在同一時刻只有一個線程能夠進入臨界區(訪問互斥資源的代碼塊),並且在這個鎖被釋放之前,其他線程就不能進入該臨界區。

異步和非堵塞類似,由於每個線程都包含了運行時自身所需要的數據或方法,因此在進行輸入輸出時,不必關心其他線程的狀態或行爲。

 

多線程同步的方式有哪些?

1.使用synchronized關鍵字來實現同步

synchronized鎖的不是代碼,鎖的都是對象

根據獲取的鎖的分類:獲取對象鎖和獲取類鎖

獲取對象鎖的兩種用法

1.同步代碼塊:鎖的是小括號中的實例對象

2.同步非靜態方法:鎖的是當前對象的實例對象

獲取類鎖的兩種用法

1.同步代碼塊:鎖的是小括號中的類對象

2.同步靜態方法:鎖的是當前對象的類對象

 

2.wait()和notify()方法

當synchronized代碼被執行期間,可以使用對象的wait()方法釋放鎖,進入等待狀態,並且調用notify()或notifyAll()方法通知正在等待的其他線程。notify()方法喚醒一個線程並允許它去獲得鎖。notifyAll()方法喚醒所有等待線程,允許它們競爭去獲得鎖。

3.Lock

JDK5新增了Lock接口以及它的一個實現類ReentrantLock(重入鎖),Lock也可以用來實現多線程的同步。

lock()。以阻塞的方式獲取鎖(獲得鎖立即返回;如果別的線程持有鎖,一直等待,直到拿到鎖)

tryLock()。以非阻塞的方式獲取鎖。嘗試地去獲取一下鎖,如果獲取到鎖,立即返回true,否則立即返回false.

tryLock(long timeout,TimeUnit unit)。如果獲取了鎖,立即返回true,否則等待timeout時間,期間獲取到鎖,返回true,否則返回false.

使用:

Final Lock lock = new ReentrantLock();

lock.lock();

..........加鎖代碼

lock.unlock();

公平鎖:

線程是按照獲取鎖的順序執行的

非公平鎖:

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章