了解執行緒同步的作用
乙個多執行緒的程式,如果是通過runnable介面實現的,則意味著類中的屬性將被多個執行緒共享,那麼這樣一來就會造成一種問題,如果這多個執行緒要操作同一資源的時候就有可能出現資源的同步問題。例如:以之前的賣票程式來講,如果多個執行緒同時操作的時候就有可能出現賣出票為負數的問題。
package com.dong1990;
public class fifth
}class mythread implements runnable catch (interruptedexception e)
system.out.println("賣票:ticket = " + ticket--) ;
從執行結果可以發現,程式中加入了延遲操作,所以在執行的最後出現了負數的情況,那麼為什麼現在會產生這樣的問題呢?
從上面的操作**可以發現對於票數的操作步驟如下:
1、 判斷票數是否大於0,大於0則表示還有票可以賣
2、 如果票數大於0,則賣票出去
但是,在上面的操作**中,在第1步和第2步之間加入了延遲操作,那麼乙個執行緒就有可能在還沒有對票數進行減操作之前,其他執行緒就已經將票數減少了,這樣一來就會出現票數為負的情況。
如果想解決這樣的問題,就必須使用同步,所謂的同步就是指多個操作在同乙個時間段內只能有乙個執行緒進行,其他執行緒要等待此執行緒完成之後才可以繼續執行。
解決資源共享的同步操作,可以使用同步**塊和同步方法兩種方式完成。
了解同步**塊及同步方法的作用
在**塊上加上「synchronized」關鍵字的話,則此**塊就稱為同步**塊。
同步**塊格式:
使用同步**塊解決以上的同步問題synchronized(同步物件)
除了可以將需要的**設定成同步**塊之外,也可以使用synchronized關鍵字將乙個方法宣告成同步方法。package com.dong1990;
public class fifth
}class mythread implements runnable catch (interruptedexception e)
system.out.println("賣票:ticket = " + ticket--) ;}}
} }}
同步方法定義格式:
使用同步方法解決以上問題synchronized 方法返回值 方法名稱(引數列表){}
了解死鎖的產生package com.dong1990;
public class fifth
}class mythread implements runnable
} public synchronized void sale() catch (interruptedexception e)
system.out.println("賣票:ticket = " + ticket--) ;
} }}
同步可以保證資源共享操作的正確性,但是過多同步也會產生問題。例如:現在有張三想要李四的畫,李四想要張三的書,那麼張三對李四說了:「把你的畫給我,我就給你書」,李四也對張三說了:「把你的書給我,我就給你畫」,此時,張三在等著李四的答覆,而李四也在等著張三的答覆,那麼這樣下去最終結果可想而知,張三得不到李四的畫,李四也得不到張三的書,這實際上就是死鎖的概念。
}class mythread implements runnable catch (interruptedexception e) // 加入延遲,要處理異常
synchronized (ls)
}} else catch (interruptedexception e) // 加入延遲,要處理異常
synchronized (zs)
}} } }
class zhangsan
public void get()
}class lisi
public void get()
}
多執行緒 同步與死鎖
多個操作在同一時間內 只能有乙個執行緒執行,其他執行緒要等此執行緒完成之後才能繼續執行。要解決資源共享的同步操作問題,可以使用同步 塊和同步方法完成。1.1 同步 塊 塊分四種 1 普通 塊 是直接定義在方法之中的。2 構造塊 是定義在類中的,優先於構造方法執行,可以重複呼叫 3 靜態塊 是使用st...
多執行緒 同步與死鎖
程序 是程式的執行過程 是乙個動態的 程序中持有資源 共享記憶體,共享檔案 和執行緒 執行緒 是系統中最小的執行單元,同一程序中有多個執行緒,執行緒共享程序的資源 多執行緒圖 執行緒的5種狀態 同步什麼時間用 資源共享時需要進行同步操作 同步的缺點 程式中過多的同步會產生死鎖 經典案例 生產者消費者...
執行緒同步與死鎖
執行緒同步與死鎖 課程大綱 一 多執行緒共享資料 1 在多執行緒的操作中,多個執行緒有可能同時處理同乙個資源,這就是多執行緒中的共享資料。二 執行緒同步 1 解決資料共享問題,必須使用同步,所謂同步就是指多個執行緒在同乙個時刻只能有乙個執行緒執行指定 其他執行緒要等到該執行緒執行結束之後才能繼續執行...