1. 程式人生 > >執行緒中的同步程式碼塊synchronized、同步方法和同步鎖Lock

執行緒中的同步程式碼塊synchronized、同步方法和同步鎖Lock

在學習執行緒的時候,因為執行緒的排程具有不確定性,所以銀行取錢問題、多個視窗售賣火車票問題都是反應多執行緒的優越性以及不確定性。當程式中有多個併發執行緒在進入一個程式碼塊中並且修改其中引數時,就很有可能引發執行緒安全問題從而造成異常。
同步程式碼塊
所以,java在其中就引入了同步監視器來解決關於多執行緒的支援問題

synchronized(obj)
{
    同步程式碼塊
}

上面就是同步的程式碼塊方式,也就是說,當執行緒開始執行同步程式碼塊之前,必須先獲得對同步監視器的鎖定,而且無論在什麼時候,只能有一個執行緒可以獲得對同步監視器的鎖定,當同步程式碼執行完成之後,這個執行緒會釋放該執行緒的同步監視器的鎖定。


任何執行緒在修改指定的引數資源之前,都需要對該引數資源加鎖,在加鎖期間其他的執行緒是不能對這個引數資源進行修改的,只有在該執行緒完成修改並且釋放對該引數的鎖定之後其他執行緒才有機會對該引數進行修改。這樣做也就是符合了“加鎖–>修改–>釋放”的邏輯順序。
同步方法
其實這個還有一個同步方法,也就是用關鍵字synchronized來修飾一個方法,對於關鍵字synchronized修飾的方法,就不需要再指定同步監視器了,因為同步方法的同步監視器就是this,也就是呼叫了該方法的物件。

public synchronized void testThread()
{
    //需要執行的程式碼塊
}

需要注意的是:synchronized可以修飾方法和程式碼塊,就是不能修飾構造器和成員變數等。

同步鎖
Lock提供了比synchronized更加廣泛的鎖定操作,能夠實現更靈活的結構,而且支援多個condition物件。
在實現執行緒安全的控制中,比較常用的是ReentrantLock,使用該物件可以顯式的加鎖和釋放鎖,格式如下:

class A
{
    private final ReentrantLock lock=new ReentrantLock();
    public void b()
    {
        lock.lock
(); try{ //需要執行的程式碼塊 }catch(Exception e){ e.printStackTrace(); }finally{ lock.unlock(); } } }

為了確保能夠在必要的時候釋放鎖,所以上面的程式碼中使用finally來確保鎖的釋放。

相關推薦

執行同步程式碼synchronized同步方法同步Lock

在學習執行緒的時候,因為執行緒的排程具有不確定性,所以銀行取錢問題、多個視窗售賣火車票問題都是反應多執行緒的優越性以及不確定性。當程式中有多個併發執行緒在進入一個程式碼塊中並且修改其中引數時,就很有可能引發執行緒安全問題從而造成異常。 同步程式碼塊 所以,j

執行安全問題:同步程式碼synchronized

package thread; public class ThreadDemo4 {  /**   * @執行緒安全問題:   * 通過分析,發現,打印出0,-1,-2等錯票。   * 多執行緒的執行出現了安全問題。   *   *  問題的原因:   *   當多條語句

同步(同步程式碼synchronized(this) 同步方法 全域性同步處理方法對比)

為什麼會出現同步處理? 如果要寫一個多個執行緒賣票的程式碼,按照原本思路程式碼如下: class MythreadB implements Runnable { private Integer tickets=10; public void run() {

執行同步程式碼的兩種方法

程式碼塊同步public void print2(){ synchronized (this) { System.out.print("w"); System.out.print("o"); System.out.print("r"); Sy

java多執行的sleep()wait()notify()物件的關係

1、sleep()不釋放物件鎖。 2、wait()釋放物件鎖。 3、notify()不釋放物件鎖。 (1)、notify釋放鎖嗎?不要誤導別人。notifty()只是喚醒此物件監視器上等待的單個執行緒,直到當前執行緒釋放此物件上的鎖,才有可能繼續執行被喚醒的執行緒。 (2)

用Handler的post()方法來傳遞執行程式碼段到主執行執行

package com.kale.handler; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android

Java多執行注入Spring的Bean-使用靜態方法直接取的容器的spring物件

目前認為比較好的解決方案。 1,工具類 public class SpringApplicationContextHolder implements ApplicationContextAware { private static ApplicationContext context

用C++11的std::async代替執行的建立and std::futurestd::promisestd::packaged_task

c++11中增加了執行緒,使得我們可以非常方便的建立執行緒,它的基本用法是這樣的: void f(int n); std::thread t(f, n + 1); t.join();   但是執行緒畢竟是屬於比較低層次的東西,有時候使用有些不便,比如我希望獲取執行緒函式的返回結果的時候,我就不能直接通過

Java多執行同步同步程式碼waitnotify與notifyAll的真正含義與工作原理

今天在和導師討論Java多執行緒程式設計的同步問題時,發現自己對同步程式碼塊、wait()方法、notify()方法和notifyAll()方法的理解不太清晰,於是在網上查閱資料,可是結果眾說紛紜,又在

java 多執行synchronized同步方法,同步程式碼

執行緒安全問題 同步和非同步 我們知道多個執行緒共享堆記憶體,當兩個或者多個執行緒呼叫同一個物件的方法操作物件成員時,因為cpu輪流執行執行緒,執行緒A剛開始操作物件方法,修改了資料,輪到執行緒B執行,執行緒B也操作物件方法,修改資料,可能又輪到執行緒A操作物件方法,接著上次執行緒A的剩餘部

javaSE (三十五)多執行 ( 多執行實現方法區別同步程式碼方法執行安全))

主要還是熟悉api,熟悉方法,簡單,需要多實踐 1、 多執行緒實現方法和區別: 多執行緒實現的兩種方法: 1)類繼承Thread類或實現Runnable介面,重寫run()方法 2)建立Thread的子類物件(需要開幾個執行緒就建立幾個物件,可建立匿名內部類) 3)子類

Java第十三天學習筆記~多執行執行的狀態建立執行的第二種方式同步程式碼同步函式)

                                 多執行緒 執行緒的狀態 CPU的執行資格:可以被C

執行,兩種實現方式(繼承Thread,實現Runnable介面),設定獲取名字,同步程式碼方法,死

1.多執行緒的引入(瞭解) 1.什麼是執行緒 執行緒是程式執行的一條路徑, 一個程序中可以包含多條執行緒 多執行緒併發執行可以提高程式的效率, 可以同時完成多項工作 2.多執行緒的應用場景 紅蜘蛛同時共享螢幕給多個電腦 迅雷開啟多條執行緒一起下載 Q

【多執行synchronized同步程式碼

一、前言        使用synchronized宣告的方法在 某些情況下是有弊端的,比如A執行緒呼叫同步的方法執行一個長時間的任務,那麼B執行緒就必須等待比較長的時間才能執行,這種情況可以使用synchronized程式碼塊去優化程式碼執行時間,也就是通常所說的減少鎖的

執行同步 synchronized 同步程式碼 同步方法 同步

一 同步程式碼塊 1.為了解決併發操作可能造成的異常,java的多執行緒支援引入了同步監視器來解決這個問題,使用同步監視器的通用方法就是同步程式碼塊。其語法如下: synchronized(obj){ //同步程式碼塊 } 其中obj就是同步監視器,它的含義是:執行

Java多執行6 同步函式的同步程式碼的區別

同步程式碼塊的出現是解決了多執行緒的安全問題,但是它增加了程式碼的縮排層級,同時降低了效率(每次無論是不是對的鎖,每個路徑都要去判斷) 針對同步出現的這兩個問題,首先討論第一個。因此引出一個新的知識點———————— 同步函式 關於同步函式的使用(一買車票的程式碼為例子

執行五:synchronized同步程式碼

使用synchronized的弊端A執行緒呼叫同步方法執行一個長時間的任務,那麼B執行緒則必須等待比較長時間。synchronized同步程式碼塊兩個併發執行緒訪問同一個物件object中synchro

Synchronized同步程式碼時加物件發生改變會引發什麼執行問題

package com.Synchronized; public class SynchronizedTest { public static void main(String[] args) { Test2 t = new Test2(); //Test3 t

33-多執行緒--賣票示例+執行緒安全(產生原因+解決方式:同步)+同步同步程式碼塊+同步的好處與弊端+同步的前提+同步函式+賣票示例的同步函式寫法+驗證同步函式的+驗證靜態同步函式的

一、賣票示例 需求:四個視窗,同時售賣100張票,票號為1-100 1、沒有多執行緒時的賣票程式碼 class Ticket { //100張票 private int num = 100; public void sale() { /

Java子類與父類靜態程式碼非靜態程式碼建構函式的執行順序一覽表

子類Child繼承父類Parent Child child=new Child(); 執行順序如下: ①父類靜態程式碼塊>>②子類靜態程式碼塊>>③父類非靜態程式碼塊>>④父類建構函式>>⑤子類非靜態程式碼塊>>⑥子類