关键字回顾(final/finally/finalize()、Synchronized、volatile、static)
1. final, finally, finalize的區別
final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
finally是異常處理語句結構的一部分,表示總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源
回收,例如關閉文件等。
1.1 final
當用final修飾一個類時,表明這個類不能被繼承。
- final類中的成員變量可以根據需要設為final,但是要注意final類中的所有成員方法都會被隱式地指定為final方法。
“使用final方法的原因有兩個:
- 第一個原因是把方法鎖定,以防任何繼承類修改它的含義;
- 第二個原因是效率。
在早期的Java實現版本中,會將final方法轉為內嵌調用。但是如果方法過于龐大,可能看不到內嵌調用帶來的任何性能提升。
在最近的Java版本中,不需要使用final方法進行這些優化了。“
對于一個final變量:
- 如果是基本數據類型的變量,則其數值一旦在初始化之后便不能更改;
- 如果是引用類型的變量,則在對其初始化之后便不能再讓其指向另一個對象。
2.?Synchronized和lock
synchronized是Java的關鍵字,當它用來修飾一個方法或者一個代碼塊的時候,能夠保證在同一時刻最多只有一個線程執行該段代碼
JDK1.5以后引入了自旋鎖、鎖粗化、輕量級鎖,偏向鎖來有優化關鍵字的性能。
Lock是一個接口,而synchronized是Java中的關鍵字,synchronized是內置的語言實現;
synchronized在發生異常時,會自動釋放線程占有的鎖,因此不會導致死鎖現象發生;而Lock在發生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死鎖現象,因此使用Lock時需要在finally塊中釋放鎖;
Lock可以讓等待鎖的線程響應中斷,而synchronized卻不行,使用synchronized時,等待的線程會一直等待下去,不能夠響應中斷;
通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。
2.1?Syncronized鎖,如果用這個關鍵字修飾一個靜態方法,鎖住了什么?如果修飾成員方法,鎖住了什么?
synchronized修飾靜態方法以及同步代碼塊的synchronized (類.class)用法鎖的是類,線程想要執行對應同步代碼,需要獲得類鎖。
synchronized修飾成員方法,線程獲取的是當前調用該方法的對象實例的對象鎖。
3.?volatile
volatile關鍵字是用來保證有序性和可見性的。這跟Java內存模型有關。
比如我們所寫的代碼,不一定是按照我們自己書寫的順序來執行的,編譯器會做重排序,CPU也會做重排序的,這樣的重排序是為了減少流水線的阻塞的,引起流水阻塞,比如數據相關性,提高CPU的執行效率。
需要有一定的順序和規則來保證,不然程序員自己寫的代碼都不知道對不對了,所以有happens-before規則,其中有條就是volatile變量規則:
- 對一個變量的寫操作先行發生于后面對這個變量的讀操作;
有序性實現的是通過插入內存屏障來保證的。
可見性:
- 首先Java內存模型分為,主內存,工作內存。
- 比如線程A從主內存把變量從主內存讀到了自己的工作內存中,做了加1的操作,但是此時沒有將i的最新值刷新會主內存中,線程B此時讀到的還是i的舊值。
- 加了volatile關鍵字的代碼生成的匯編代碼發現,會多出一個lock前綴指令。
- Lock指令對Intel平臺的CPU,早期是鎖總線,這樣代價太高了,后面提出了緩存一致性協議,MESI,來保證了多核之間數據不一致性問題。
4.static
4.1 是否可以在static環境中訪問非static變量?
static變量在Java中是屬于類的,它在所有的實例中的值是一樣的。
當類被Java虛擬機載入的時候,會對static變量進行初始化。
如果你的代碼嘗試不用實例來訪問非static的變量,編譯器會報錯,因為這些變量還沒有被創建出來,還沒有跟任何實例關聯上。
4.2?”static”關鍵字是什么意思?Java中是否可以覆蓋(override)一個private或者是static的方法?
“static”關鍵字表明一個成員變量或者是成員方法可以在沒有所屬的類的實例變量的情況下被訪問。
Java中static方法不能被覆蓋,因為方法覆蓋是基于運行時動態綁定的,而static方法是編譯時靜態綁定的。
static方法跟類的任何實例都不相關,所以概念上不適用。
總結
以上是生活随笔為你收集整理的关键字回顾(final/finally/finalize()、Synchronized、volatile、static)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基础回顾(正则、循环、和、 int和In
- 下一篇: 基础回顾(Map、==/equals()