JAVA 執行緒同步 synchronized

2021-07-27 09:52:20 字數 2419 閱讀 5599

先舉個例子說明一下不採用執行緒同步帶來的後果,假設現在我手上有20張票,僱傭2個人幫我賣票(2個人共享20張票),假設就剩最後一張了,那麼如果乙個人先看自己手上還有票,就賣給別人了,如果判斷和賣個別人中間所花費時間過長,執行緒切給另乙個人,此時票數還是2張,他認為也可以賣,就賣出了兩張票。

public class testdouble implements  runnable catch (interruptedexception e) 

total--;

system.out.println("現在還有:"+total+"張票");

} else break;

} }public static void main(string args)

}

現在還有:18張票

現在還有:18張票

現在還有:17張票

現在還有:16張票

現在還有:15張票

現在還有:14張票

現在還有:13張票

現在還有:12張票

現在還有:11張票

現在還有:10張票

現在還有:9張票

現在還有:8張票

現在還有:7張票

現在還有:6張票

現在還有:5張票

現在還有:4張票

現在還有:3張票

現在還有:2張票

現在還有:1張票

現在還有:0張票

現在還有:-1張票

為了避免這種情況的發生,我們使用synchronized進行修飾。

當乙個執行緒拿到 synchronized修飾的物件時,其他也需要拿到這個物件才能執行的執行緒不能執行了。

(執行緒——物件)

public class testdouble2 implements runnable catch (interruptedexception e) 

total--;

system.out.println("現在還有:"+total+"張票");

}else}}

public static void main(string args)

}

現在還有:19張票

現在還有:18張票

現在還有:17張票

現在還有:16張票

現在還有:15張票

現在還有:14張票

現在還有:13張票

現在還有:12張票

現在還有:11張票

現在還有:10張票

現在還有:9張票

現在還有:8張票

現在還有:7張票

現在還有:6張票

現在還有:5張票

現在還有:4張票

現在還有:3張票

現在還有:2張票

現在還有:1張票

現在還有:0張票

或者採用以下方法:

public class testdouble2 implements runnable catch (interruptedexception e) 

total--;

system.out.println("現在還有:"+total+"張票");

}else}}

} public static void main(string args)

}

比較奇妙的是以下方法:

public class testdouble2 implements runnable catch (interruptedexception e) 

total--;

system.out.println("現在還有:"+total+"張票");

}else}}

public static void main(string args)

}

此種方法無法防止,理由是synchronized是拿到所修飾的物件,而這兩個執行緒是分屬兩個不同的物件的(各自new 出來的),所以無法避免,這也就是說extends無法使用synchronized關鍵字實現執行緒共享(因為extends肯定是各自new出兩個新物件)。

事實上,即使是i++也會導致不同步:

int i=0;

public int getnext()

因為jvm首先在jvm堆給i分配乙個記憶體儲存場所,執行緒啟動後會自動分配一片運算元棧,現將這個值讀取到棧中操作再寫回堆中,所以需要間隔一段時間,這段時間如果切換執行緒就會導致不同步。

總結:synchronized關鍵字實現執行緒共享的方法是獲得類所對應的的物件,在自己使用時,避免其他執行緒使用該物件。

可以使用在方法上,也可以使用在物件上。

Ansible 資料同步模組synchronize

ansible 資料同步模組synchronize 主要用於目錄 檔案的同步,主要基於rsync命令工具同步目錄和檔案 ansible synchronize模組詳解 compress 開啟壓縮,預設為開啟 archive 是否採用歸檔模式同步,保證原始檔和目標檔案屬性一致 checksum 是否效...

java 執行緒 執行緒同步

threadlocal與其它同步機制的比較 threadlocal和其他所有的同步機制都是為了解決多執行緒中的對同一變數的訪問衝突。在普通的同步機制中,是通過對物件加鎖來實現多個執行緒對同一變數的安全訪問的。這時該變數是多個執行緒共享的,使用這種同步機制需要很細緻的分析在什麼時候對變數進行讀寫,什麼...

java同步執行緒

同步執行緒 synchronized方法 乙個類中任何方法都可以定義為synchronized方法以防止多執行緒資料崩潰。當某個物件用synchronized方法修飾時,表明該物件在任一時刻只能由乙個執行緒訪問。宣告方法體的一般格式 modifier synchronized returntype ...