Java-對象及變量的併發訪問小結

1)多線程環境下,方法內的變量是線程安全的安全

2)多個線程同時處理一個實例,這個實例內的變量是不安全的多線程

3)不一樣線程中注入同一個類的不一樣實例,實例中的變量是安全的異步

4)Synchronized獲取到的鎖是對象鎖,當多個線程訪問同一個對象時,哪一個線程先執行帶Synchronized關鍵字的方法,哪一個線程就持有該方法所屬對象的鎖,其餘線程是等待狀態性能

5)調用關鍵字Synchronized聲明的方法必定是排隊運行的,另外,只有共享資源的訪問才須要同步化this

6)一個對象內有多個Synchronized方法/塊時線程

  A)A線程先持有object對象的鎖,B線程能夠以異步的方式調用object對象的非Synchronized方法server

  B)A線程先持有object對象的鎖,B線程若是此時調用object對象中的任一Synchronized方法,則須要等待A線程釋放鎖,也就是同步對象

7)實例中有兩個變量,有一個Synchronized聲明的方法,方法執行過程當中,若一個變量賦值完成,一個變量未賦值完成,此時調用實例中非Synchronized方法去獲取實例中兩個變量的值,此時就會出現髒讀,解決的辦法是讀取的方法上也加入Synchronized聲明繼承

8)Synchronized是對象鎖,A線程獲取到對象鎖時,可執行被Synchronized聲明的X方法,其餘線程想要執行這個對象的任何被Synchronized聲明的方法都得等待A釋放,由於其餘線程未獲取到鎖資源

9)Synchronized鎖重入,在使用Synchronized時,當一個線程獲得對象鎖時,在此請求此對象的對象鎖能夠再次獲得該對象的鎖,一個Synchronized方法/塊內部,能夠調用本類的其餘Synchronized方法/塊(也就是說只要不釋放,可以一直獲取本實例的鎖)

10)Synchronized不能繼承,舉個栗子,父類方法被Synchronized修飾,子類覆寫父類的該方法,但並不帶Synchronized修飾,就不會產生同步的效果

11)Synchronized代碼塊,確定比Synchronized方法性能要好一些,也就是說Synchronized後面大括號,包裹的代碼越少越好。當一個線程在執行Synchronized代碼塊時,其餘線程能夠執行這個代碼塊外部的代碼

12)Synchronized代碼塊與Synchronized方法特性基本相同

13)任意對象均可以做爲對象監視器,能夠Synchronized(任意對象),優勢:若是一個類中有不少個Synchronized方法,這時雖然可以實現同步,但會受到阻塞,因此影響運行效率;但若是使用同步代碼塊鎖非this對象,則Synchronized(非this)代碼塊的程序與同步方法是異步的,不與其餘鎖this同步方法爭搶this鎖,可大大提升運行效率

  A)當多個線程同時執行Synchronized(X,非this)同步代碼塊時呈同步效果

  B)當其餘線程執行X對象中Synchronized同步方法時也呈同步效果

  C)當其餘線程執行X對象方法裏面的Synchronized(this)時也呈同步效果

14)Synchronized能夠用在static關鍵字之上,表示對當前類持鎖,class鎖。class鎖能夠對類的全部對象實例起做用。也就是說,對於class A來講,即使多個線程中每一個線程建立一個A的實例,只要他們調用的是A中static synchronized的方法(或者static方法中的synchronized代碼塊),就得等着,就是同步

15)一般狀況下,都不會將String做爲鎖對象,由於String存在一個常量池,當兩個線程調用的String相等時,至關因而競爭同一個鎖;另外,當鎖住某個String變量時x,若同步方法內對x進行了更改,至關於鎖對象就變化了,其餘再來競爭鎖就能競爭到,就起不到同步的效果了(須要注意的是,只要對象不變,即使對象的屬性發生變動,也是同步的,String是由於其池化致使的一系列不一樣)

16)當一個synchronized方法中出現死循環時(永遠都不會釋放鎖),其餘調用改對象中synchronized方法的線程均會一直等下去,解決方法是儘可能每一個方法鎖不一樣的對象,而不是都鎖this

17)死鎖,一個方法,先鎖A,等一會再鎖B;另外一個方法,先鎖B,等一會再鎖A;當兩個方法同時執行時,就出現死鎖了。

18)volatile的主要做用是使變量在多個線程間可見。原理是強制線程從公共堆棧中得到變量的值,而不是從線程的私有堆棧中取值。(舉個栗子:當JVM設置爲-server模式時,爲了線程運行的效率,線程一直在私有堆棧中取值,這樣,在一個while(x)的循環中,就算外部將x設置爲false,線程內也不會跟着改變,從而進入到死循環狀態,這是就須要用到volatile關鍵字了。volatile主要使用的場合是在多個線程中,能夠感知實例變量被改變了,而且得到最新的值使用)

19) volatile本質上解決的是私有堆棧與公共堆棧中的值不一樣步

20)volatile與synchronized的異同

  A)volatile是線程同步的輕量級實現,性能要比synchronized好;volatile只能修飾變量,而synchronized能夠修飾方法或者代碼塊,synchronized還有性能提高的空間

  B)使用volatile不會產生阻塞,而使用synchronized會產生阻塞

  C)volatile保證可見性,但不保證原子性;synchronized保證原子性,間接保證可見性(一個變量只能在同步中操做完成了,才能被其餘線程操做,因此叫間接)

  D)volatile解決的是變量在多個線程之間的可見性,而synchronized解決的是多個線程訪問資源的同步性

21)synchronized能夠保證在同一時刻,只有一個線程能夠執行某一個方法或者某一代碼塊,它包含兩個特性:互斥性和可見性。不進能夠解決一個線程看到對象處於不一致狀態,還能夠保證進入同步方法或者同步代碼塊的每一個線程,都看到由同一個鎖保護以前的全部的修改效果。

相關文章
相關標籤/搜索