執行緒sychronized的坑

2021-10-05 15:54:34 字數 1216 閱讀 6172

執行緒的理解

定義 : sychronized對方法鎖呼叫時候是對物件加鎖,這樣當執行緒再次使用物件的加鎖資源就不需要重新獲取鎖

1. sychronized對物件方法使用同步時,鎖定的是整個物件,但如果有其他執行緒在加鎖過程中執行了該物件的非同步方法或屬性,卻可以被其他執行緒同時執行。這點很奇怪.鎖定物件的時候,其他執行緒應該無法使用物件內部任何東西,不單單只是同步該物件的同步方法
main.

class

mytest my =

newmytest()

; thread a =

newthread

(new

mythread

(my));

// 執行緒中呼叫my的同步方法

a.start()

; thread.

sleep(1

);// 該方法不是同步方法

my.ccc();

// 不是同步屬性

system.out.

println

("my.a:"

+my.a)

;// 是同步方法

my.bbb(

);

結果

mytest0 threadname:thread-

0這是ccc

my.a:

1還未退出同步:

mytest1100 threadname:main

mythread:

1 threadname:thread-

0

結果第1,4行是在乙個同步方法中的**顯示結果,2-3是另外執行緒執行結果,通過結果分析,其他執行緒呼叫被鎖物件的非同步方法,和屬性是可以的.

方法鎖鎖定物件後,只會對需要同步的方法加鎖,需要同步的方法可以正常的被執行,即雖然鎖了物件,但是不是對物件所有的資源進行加鎖,廢話一句,所以成員的私有化就很有必要,可以更好保證準確同步.

2. 雖然sychronized作用在方法和同步**塊sychronized(this)都是說鎖定物件,但是其中還是有差別的,方法鎖定的物件,多個執行緒時,還可同時呼叫非同步方法和屬性.this鎖定的物件,無法呼叫非同步方法和屬性.

sychronized(this)說白了就是對物件所有的方法屬性都鎖住了。但是sychronized方法只能對物件中的同步方法進行鎖定,說白了就是對方法加鎖

多執行緒安全之內置鎖(sychronized)

內建鎖sychronized 可以保證執行緒的原子性,當執行緒進入方法的時候會自動獲取鎖,其他執行緒只能進入等待狀態 採用內建鎖 sychronized 的方式,解決執行緒安全問題 通過模擬搶購車票的案例來演示 class ticksale implements runnable catch int...

關於sychronized的使用

1.執行的前提 執行緒必須占有cpu 2.執行緒有資格競爭cpu的前提 執行緒是runnable狀態 0.搶鎖的前提是先搶cpu 1.搶鎖失敗 狀態從runnable 修改為 blocked 執行緒從就緒佇列移動到該鎖的阻塞佇列上 從開始請求鎖到最終搶到鎖,經歷了滄海桑田 放乙個陣列,長度為1000...

執行緒池的坑

最近實現執行緒池踩了不少坑 記錄如下 執行緒池建立了兩個執行緒,放兩個任務進去,發現任務沒執行 例如 void task void task2 int i int main 程式執行之後沒有任何列印在終端,但是gdb 和strace都是有輸出的.一共發現兩個問題最終解決之 先看執行緒池的實現 thr...