Synchronized修飾靜態變量和普通變量的區別


這里主要涉及到類對象(static方法),對象方法(非static方法)

我們知道,當synchronized修飾一個static方法時,多線程下,獲取的是類鎖(即Class本身,注意:不是實例);

當synchronized修飾一個非static方法時,多線程下,獲取的是對象鎖(即類的實例對象)

所以,當synchronized修飾一個static方法時,創建線程不管是new JoinThread()還是new Thread(new JoinThread()),在run方法中執行inc()方法都是同步的;

相反,當synchronized修飾一個非static方法時,如果用new JoinThread()還是new Thread(new JoinThread())方式創建線程,就無法保證同步操作,因為這時

inc()是屬於對象方法,每個線程都執有一個獨立的對象實例new JoinThread(),所以多線程下執行inc()方法並不會產生互斥,也不會有同步操作。

 

另外如果考慮到變更的原子操作,可使用atomic包下面的包裝對象,這些對象都是對volatile修飾變量的一種延伸,可保證變量的原子操作而不用去同步方法或

代碼塊是否同步。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM