Java线程同步
一、定義
當兩個或多個線程需要訪問同一資源時,需要以某種順序來確保該資源某一時刻只能被一個線程使用
二、實現線程同步的方法
同步方法( synchronized ) 同步代碼塊( synchronized)三、同步代碼塊
同步代碼塊:synchronized放在對象前面限制一段代碼的執行語法格式:
synchronized(對象)//這個對象可以為任意對象 ,該對象就是鎖 { 需要被同步的代碼 }同步條件
必須要有兩個或者兩個以上的線程缺點:
多個線程需要判斷鎖,較為消耗資源四、鎖
互斥鎖
同一時刻只能有一個線程占用,其他線程要等這個線程執行完釋放鎖以后才能使用鎖任意鎖
可以是任意類型對象多個線程必須使用同一個鎖 , 才能起到互斥的作用
同步中的鎖
同步代碼塊:this或其他共同對象非靜態方法:this靜態方法:類.class注意:
任意鎖和互斥鎖是同一個鎖,只是從不同角度出發,定義為不同的鎖。任意鎖:指對象類型可以任意;互斥鎖指鎖一次只能讓一個線程用五、同步方法
同步非靜態方法
synchronized放在方法聲明中,表示整個方法為同步方法,鎖定this對象,如果有一個線程進入了該方法,其他線程要想使用當前this對象的任何同步方法,都必須等待前一個線程執行完該同步方法之后同步靜態方法
synchronized放在static方法聲明中,表示鎖定該類的class對象(Xxx.class,是Class類型的,是描述一個類的信息的對象)如果有一個線程進入了該方法,其他線程要想使用當前類中的任何同步靜態方法,都必須等待前一個線程執行完該同步方法之后;其他非同步方法及非靜態的同步方法的執行不受影響六、鎖的選擇
多個線程共享資源,為了保證數據安全,需要同步 一般情況下選擇資源作為鎖(必須為引用類型)即可,也可以選擇其他唯一的對象七、死鎖
線程雙方都持有者自己的鎖不放,還想要對象的鎖,僵持著,于是產生死鎖死鎖發生的條件
同步中嵌套同步鎖不同八、守護線程
1)在Java中有兩類線程User Thread(用戶線程或前臺線程) Daemon Thread(守護線程或后臺線程)2)其實User Thread線程和Daemon Thread守護線程本質上來說去沒啥區別的,唯一的區別之處就在虛擬機的離開:如果User Thread全部撤離,那么Daemon Thread也就沒啥線程好服務的了,所以虛擬機也就退出了3)設置守護線程的方法要寫在 start前面4)子線程設置成為守護線程, 當主線程 執行完了,子線程就結束執行5)線程對象.setDaemon(true) 默認為false總結
- 上一篇: Java之进程与线程
- 下一篇: Java线程间通信